如何按时间顺序对数组进行排序?

9

我有一个非关联数组,其中输入的数据未排序(我从外部系统接收数据,无法强制将其按排序顺序放入数组中)。 有没有办法对这些值进行排序? 我尝试过以下方法:

$wedTrackTimes = array("9:30 AM-10:30 AM", "8:15 AM-9:15 AM", "12:30 PM-1:30 PM", "2:00 PM-3:00 PM", "3:30 PM-4:30 PM");
$wedTrackTimes = array_unique($wedTrackTimes);
$wedTrackTimes = sort($wedTrackTimes);
print_r($wedTrackTimes);

但是它返回的不是一个排序后的数组,而是1。我猜测这是因为它是非关联的,所以没有键。有没有办法仅按值对数组进行排序?我们真的需要9:30 AM时段在8:15 AM时段之后,因为它应该在后面。
更新
感谢所有回答;虽然它确实使数组排序了,但并不符合预期。如果我使用默认的排序类型,我会得到以下结果:
Array
(
    [0] => 12:30 PM-1:30 PM
    [1] => 2:00 PM-3:00 PM
    [2] => 3:30 PM-4:30 PM
    [3] => 8:15 AM-9:15 AM
    [4] => 9:30 AM-10:30 AM
)

使用SORT_NUMERIC,我得到了以下结果:
Array
(
    [0] => 2:00 PM-3:00 PM
    [1] => 3:30 PM-4:30 PM
    [2] => 8:15 AM-9:15 AM
    [3] => 9:30 AM-10:30 AM
    [4] => 12:30 PM-1:30 PM
)

使用 SORT_STRING 我得到了这个结果:
Array
(
    [0] => 12:30 PM-1:30 PM
    [1] => 2:00 PM-3:00 PM
    [2] => 3:30 PM-4:30 PM
    [3] => 8:15 AM-9:15 AM
    [4] => 9:30 AM-10:30 AM
)

我需要的是:

Array
(
    [0] => 8:15 AM-9:15 AM
    [1] => 9:30 AM-10:30 AM
    [2] => 12:30 PM-1:30 PM
    [3] => 2:00 PM-3:00 PM
    [4] => 3:30 PM-4:30 PM


)

这个可能吗?
8个回答

21

排序是通过引用实现的(这意味着它会对你传递给它的任何内容排序),它基于失败返回 true/false。你在这里做的是:

$wedTrackTimes = sort($wedTrackTimes);
将值$wedTrackTimes分配给TRUE或FALSE。
尝试
sort($wedTrackTimes);
print_r($wedTrackTimes);

问题在发布后17分钟进行了更新。之后澄清需要使用时间顺序排序,而普通的排序无法满足要求。该答案未提供所需的排序结果。 - mickmackusa
@mickmackusa 可能是正确的,但(就像 Git 一样)事后编辑通常会导致不可预测的结果。 - cwallenpoole
编码意图和示例数据没有改变。第一个障碍是“打印1”的问题,但目标始终是按时间顺序排序。OP只是还没有意识到自己不理解的东西。 - mickmackusa
@mickmackusa 请注意:我也写了被接受的答案。这个答案回答了我当时理解的问题。删除这个答案将是对历史的破坏性修改。如果我今天再做同样的事情,我可能会合并答案,但当时写两个答案似乎是更好的做法。 - cwallenpoole
其实,在看了被接受的答案之前,我也不知道。:-D - cwallenpoole
显示剩余3条评论

5
没错,sort函数返回的是bool类型。直接使用即可。
sort($wedTrackTimes);

5

看起来你需要的不仅仅是标准排序,而是更高级的内容。

// WARNING: THIS IS *NOT* BY REFERENCE. IT RETURNS A NEW ARRAY.
function getSortedTimes(array $group)
{
    $tmp = array();
    foreach( $group as $times )
    {
        // Basically, I am pairing the string for the start time with 
        // a numeric value.
        $tmp[$times] = strtotime(substr($times, 0, strpos($times, '-')));
    }
    // asort is like sort, but it keeps the pairings just created.
    asort($tmp);
    // the keys of $tmp now refer to your original times.
    return array_keys($tmp);
}

4

sort是PHP所有排序函数中的一种,可以原地排序。如果排序成功,则返回true;否则返回false。如果你只排序字符串/数字,则此结果无关紧要。

$wedTrackTimes = array("9:30 AM-10:30 AM", "8:15 AM-9:15 AM",
                       "12:30 PM-1:30 PM", "2:00 PM-3:00 PM", "3:30 PM-4:30 PM");
$wedTrackTimes = array_unique($wedTrackTimes);
sort($wedTrackTimes);
print_r($wedTrackTimes);

选择云计算是正确的选择。

1

将您的代码更改为以下内容:

$wedTrackTimes = array_unique($wedTrackTimes);
sort($wedTrackTimes);
print_r($wedTrackTimes);

正如您可以在文档中阅读到的那样,sort()的返回值为true/1或false/0,表示排序是否成功或出现错误。


1

在排序之前移除 $wedTrackTimes =。

 $wedTrackTimes = array("9:30 AM-10:30 AM", "8:15 AM-9:15 AM", "12:30 PM-1:30 PM", "2:00 PM-3:00 PM", "3:30 PM-4:30 PM");
 $wedTrackTimes = array_unique($wedTrackTimes);
 sort($wedTrackTimes);
 print_r($wedTrackTimes);

0
合理地按时间(按时间顺序)排序需要使用strtotime()
这里有一个使用array_multisort()的一行代码。调用array_map()strtotime()生成一个数组,仅用于排序顺序。
array_multisort(array_map(function($v){return strtotime(strstr($v,'-',true));},$wedTrackTimes),$wedTrackTimes);

对于那些在语法上感到困惑的人,这里是同样功能的更多代码。

代码:(演示)

$wedTrackTimes=[
    "9:30 AM-10:30 AM",
    "8:15 AM-9:15 AM",
    "12:30 PM-1:30 PM",
    "2:00 PM-3:00 PM",
    "3:30 PM-4:30 PM"
];

foreach($wedTrackTimes as $time){  // iterate the time strings
    $timestamps[]=strtotime(strstr($time,'-',true));  // store the first time of the time range as a unix timestamp
}
array_multisort($timestamps,$wedTrackTimes);  // use $timestamps to sort $wedTrackTimes

var_export($wedTrackTimes);

输出:

array (
  0 => '8:15 AM-9:15 AM',
  1 => '9:30 AM-10:30 AM',
  2 => '12:30 PM-1:30 PM',
  3 => '2:00 PM-3:00 PM',
  4 => '3:30 PM-4:30 PM',
)

0

在你的代码中

$wedTrackTimes = array("9:30 AM-10:30 AM", "8:15 AM-9:15 AM", "12:30 PM-1:30 PM", "2:00 PM-3:00 PM", "3:30 PM-4:30 PM");
$wedTrackTimes = array_unique($wedTrackTimes);
**$wedTrackTimes = sort($wedTrackTimes);**
print_r($wedTrackTimes);

不要将变量分配给排序函数, 基本上你正在将sort的值(它将是true或false)分配到wedTrackTimes中, 而不是这样使用
$wedTrackTimes = array("9:30 AM-10:30 AM", "8:15 AM-9:15 AM", "12:30 PM-1:30 PM", "2:00 PM-3:00 PM", "3:30 PM-4:30 PM");
    $wedTrackTimes = array_unique($wedTrackTimes);
    **sort($wedTrackTimes);**
    print_r($wedTrackTimes);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接