0

ここで非常に具体的な問題があります。最初に30分間隔で、次に日付で並べ替えたい多次元配列があります。関数array_multisortは私の要件を満たしていません。

例:欲しい:

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"));

最終的には:

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"));

私は、独自のソートコールバック関数と組み合わせてuksortを使用してこれを達成しようとしました。これは私が現在使用しているコードです:

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);
}

この関数を実行した直後に、print_r()を使用して配列を出力しましたが、データの順序はランダムに見えます。私は何が欠けていますか?

編集:結局のところ、順序 完全にランダムです。この行をsortThirties関数に追加しました。

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

そして私が得たのは50ページの<BR>'sだけでした。

まったく同じ配列で実行されたこのコードはソートされていないデータを提供するため、配列が正しく構造化されていることを私は知っています。

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

私が考えることができる唯一のことは、uksortに問題があるに違いないということです。何かご意見は?

4

2 に答える 2

2

uksort関数は配列をキーでソートしますが、usort配列を値でソートし、ソートされる配列は実際には次のとおりです。

$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")
                );

違いがわかりますか?:)

于 2009-03-25T07:31:41.097 に答える