PHP:按半小时间隔排序数组

时间:2009-03-24 22:35:13

标签: php arrays multidimensional-array

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

我知道数组的结构是正确的,因为在同一个数组上执行的代码会为我提供未排序的数据:

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

我唯一能想到的是uksort必定存在问题。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

很奇怪。我刚刚在类似于你提供的数组上尝试了你的代码,它运行得很好。可能性:

  • 任何阵列时间/日期的额外空格?
  • PHP版本的差异?我注意到strtotime()的返回值在PHP 5.1.0版本中已更改

答案 1 :(得分:2)

uksort 函数按键对数组进行排序,而 usort 按值对数组进行排序,并且您要排序的数组是acctualy:

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

你看到了区别吗? :)