PHP: yarım saatlik aralıklarla sıralama dizi

2 Cevap php

Ben burada çok özel bir sorun var. Ben ikinci tarihlerine göre, yarım saatlik zaman aralıklarıyla ilk sıralamak istiyorum çok boyutlu bir dizi var. Fonksiyonu array_multisort benim gereksinimlerini karşılamak değildir.

Örnek: Ben istiyorum:

array(array("time"=>"12:15",
            "date"=>"2009-03-24"),
      array("time"=>"12:10",
            "date"=>"2009-03-23"),
      array("time"=>"12:00",
            "date"=>"2009-03-24"),
      array("time"=>"11:30",
            "date"=>"2009-03-24"));

: Olarak sonuna kadar

array(array("time"=>"11:30",
            "date"=>"2009-03-24"),
      array("time"=>"12:10",
            "date"=>"2009-03-23"),
      array("time"=>"12:00",
            "date"=>"2009-03-24"),
      array("time"=>"12:15",
            "date"=>"2009-03-24"));

Ben kendi sıralama arama fonksiyonu ile birlikte uksort ile bunu gerçekleştirmek için çalıştık. Bu anda kullanarak kodu:

uksort($myArray, "sortThirties");

function sortThirties($a, $b)
{
    //Get the two times as timestamps relative to today
    $one = strtotime($a['time']);
    $two = strtotime($b['time']);

    //Round them down to the nearest half-hour time
    $one = $one - ($one % 1800);
    $two = $two - ($two % 1800);

    //Return the difference if times are unequal
    //If times are equal, return the difference between dates.
    return ($one == $two ? strcmp($a['date'],$b['date']) : $one - $two);
}

Hemen bu fonksiyonu çalıştırdıktan sonra, I) (print_r ile dizi yazdırmak ve verilerin sırası rasgele olarak görülmektedir. Ne eksik?

EDIT: It turns out, the order is completely random. I added this line to the sortThirties function:

echo "<BR>",$a['time']," ",$b['time'];

ve ben var tüm <BR> 's 50 sayfa oldu.

Ben aynı dizide üzerinde yürütülen bu kod bana düzenlenmemiş veriler verir çünkü dizi düzgün yapılandırılmıştır biliyorum:

foreach($myArray AS $a)
{
    echo "<BR>",$a['date']," ",$a['time'];
}

Aklıma tek şey uksort ile ilgili bir sorun olması gerekir. Herhangi bir düşünce?

2 Cevap

usort değeri ve sıralanması için dizi ile diziyi sıralar ise uksort fonksiyon tuşları ile diziyi sıralar acctualy olduğunu:

$to_sort = array( 
                  0 => array("time"=>"12:15", "date"=>"2009-03-24"),
                  1 => array("time"=>"12:10", "date"=>"2009-03-23"),
                  2 => array("time"=>"12:00", "date"=>"2009-03-24"),
                  3 => array("time"=>"11:30", "date"=>"2009-03-24")
                );

Eğer fark görüyor musunuz? :)

Çok garip. Sadece sağlanan birine benzer bir dizi üzerinde kodunuzu denedim ve harika çalıştı. Olasılıklar:

  • Dizi süreleri / tarihleri ​​herhangi ekstra boşluk?
  • PHP version farklar? Ben strtotime dönüş değeri () PHP 5.1.0 sürümünden beri değişmiş olduğunu fark ettim