2012-04-05 20 views
5

Şu anda PHP içinde bu mesajları kendi oluşturma tarihlerine göre sıralamak istediğim bir sorun var, böylece azalan sırada gösterilebilirler. Bunu yapmak için bir PHP fonksiyonu arıyordum ama şansım yoktu.datetime tarafından PHP'de bir dizi içinde diziler sıralama

Bunun için kolay bir çözüm var mı? Bir fikrin büyük takdir edilecektir :) Bir tamsayıya zaman damgası dönüştürmek için strtotime() kullanabilirsiniz

array 
     0 => 
     array 
      'post_id' => string '1' (length=1) 
      'user_id' => string '3' (length=1) 
      'post' => string 'this is a post' (length=14) 
      'created' => string '2012-04-05 20:11:38' (length=19) 
    1 => 
     array 
      'post_id' => string '2' (length=1) 
      'user_id' => string '2' (length=1) 
      'post' => string 'this is a post' (length=14) 
      'created' => string '2012-04-05 20:11:38' (length=19) 
    2 => 
     array 
      'post_id' => string '3' (length=1) 
      'user_id' => string '5' (length=1) 
      'post' => string 'this is a post' (length=14) 
      'created' => string '2012-04-05 20:11:38' (length=19) 
+4

bu bir gelen var mı veritabanı? Değilse neden olmasın? Bu dizinin yüklenmesi – NullUserException

+0

nereden? – hjpotter92

+3

Evet, şüpheli MySQL sorgu satırları gibi görünüyor. 'SİPARİŞ BY DESS oluşturdu' –

cevap

5

bu deneyin:

<?php 
$a=array(
     0 => 
     array(
      'post_id' => '1', 
      'user_id' => '3', 
      'post' => 'this is a post', 
      'created' => '2012-04-05 20:11:40' 
     ), 
    1 => 
     array(
      'post_id' => '2', 
      'user_id' => '2', 
      'post' => 'this is a post', 
      'created' => '2012-04-05 20:11:39' 
     ), 
    2 => 
     array(
      'post_id' => '3', 
      'user_id' => '5', 
      'post' => 'this is a post', 
      'created' => '2012-04-05 20:11:38' 
     ) 
); 
function cmp($a,$b){ 
    return strtotime($a['created'])<strtotime($b['created'])?1:-1; 
}; 

uasort($a,'cmp'); 
print_r($a); 
?> 
+0

'cmp()', $ a' '$ b''den küçük olarak kabul edilirse negatif bir değer döndürmelidir; eğer $ a'' $ b''den büyükse ve 0 ise eşitse 0 olur. – Arjan

+1

Teşekkürler, cevap güncellendi (eşit durumda bıraktım, biliyorum ..) – stewe

+0

"strtotime" gerekmiyor. YYYY-AA-GG HH: AA: SS' (24 saat) formatı, sıralama için 'strcmp' işlevine ihtiyaç duyar. – m13r

1

.

+2

'da geçerlidir. Ve bu 2B dizisini nasıl sıralamaya yardımcı olacak? –

+0

Heh tamam, belirsiz bir soru. OP'nin pullarının Y-d-m olduğunu ima ettiğini sanıyordum. –

+1

Tarihler Y-d-m biçimindeyse, bunları zaman damgalarına kolayca dönüştürebilirsiniz. Ve eğer Y-m-d biçimindeyse, bunları dönüştürmenize gerek yoktur. – Arjan

1

Öyle gibi özel bir sıralama işlevi kullanılarak bir dizi sıralayabilirsiniz: usort hakkında daha fazla bilgi için

function cmp($a, $b) { 
    if($a['created'] < $b['created']) { 
     return 1; 
    } else if ($a['created'] > $b['created']) { 
     return -1; 
    } else { 
     // The only option left is that they are equal 
     return 0; 
    } 
} 

usort($array, cmp); 

, php manpage

+1

Bu, azalan değil, artan bir sıra oluşturur. – MrCode

+1

Cevabımı güncelledim. Neyse ki sadece küçük bir değişiklik. – Arjan

1

kontrol yapabilirsiniz Kendi kriterinize göre bir dizi sıralamanızı sağlayan usort() işlevini kullanın. Belirtilen MySQL datetime alana göre ve emriyle kayıtlar/assoc_arrays arasında

function cmp($a, $b) 
{ 
    if ($a['created'] == $b['created']) { 
     return 0; 
    } 

    $aInt = strtotime($a['created']); 
    $bInt = strtotime($b['created']); 

    return ($aInt < $bInt) ? 1 : -1; 
} 
2

Sıralama dizisi: Eğer bir zamana dönüştürmek istiyorsanız

function cmp($a, $b) 
{ 
    if ($a['created'] == $b['created']) { 
     return 0; 
    } 

    return ($a['created'] < $b['created']) ? 1 : -1; 
} 

usort($myArray, "cmp"); 

print_r($myArray); 

Ya

function build_sorter($key, $dir='ASC') { 
     return function ($a, $b) use ($key, $dir) { 
      $t1=strtotime(is_array($a)?$a[$key]:$a->$key); 
      $t2=strtotime(is_array($b)?$b[$key]:$b->$key); 
      if($t1==$t2) return 0; 
      return (str_to_upper($dir)=='ASC'?($t1 < $t2):($t1 > $t2)) ? -1 : 1; 
     }; 
    } 


    // $sort - key or property name 
    // $dir - ASC/DESC sort order or empty 
    usort($arr, build_sorter($sort, $dir)); 
İlgili konular