【问题标题】:PHP: sort array by half-hour intervalsPHP:按半小时间隔对数组进行排序
【发布时间】:2010-10-15 08:06:05
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

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

    你看出区别了吗? :)

    【讨论】:

    • 是的...我真的只是问互联网上的每个人为什么我是个白痴吗?谢谢你的好意。我不知道为什么我昨天无法弄清楚。出于某种原因,我在 php 文档中看到了示例,并将键(“地球”、“苹果”等)视为值。
    • 别担心,有时它会碰巧错过类似的东西,这时像这样的网站就派上用场了。我很高兴能帮上忙 :)。
    【解决方案2】:

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

    • 任何数组时间/日期上有额外的空格?
    • PHP 版本差异?我注意到 strtotime() 的返回值在 PHP 5.1.0 版本中发生了变化

    【讨论】:

    • 某些版本的 PHP 要求在 strtotime 中传递日期和时间。这可能是他的问题。
    • 我已经在运行排序代码的同一系统上对此进行了测试。 strtotime("15:30") 返回今天下午 3:30 的 unix 时间戳。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多