0

我在这里有一个非常具体的问题。我有一个多维数组,我想先按半小时时间间隔排序,然后按日期排序。函数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

很奇怪。我刚刚在与您提供的类似的数组上尝试了您的代码,并且效果很好。可能性:

  • 任何数组时间/日期上的额外空格?
  • PHP版本差异?我注意到 strtotime() 的返回值在 PHP 5.1.0 版本中发生了变化
于 2009-03-24T23:07:40.700 回答
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 回答