PHP数组多重排序(版本5/7差异)

时间:2017-08-22 10:02:56

标签: php

我有一个这样的数组:

$json = '{"Categorie1":[{"created":"2017-07-17 08:53:00","catid":"54"},{"created":"2017-05-23 10:15:00","catid":"54"},{"created":"2017-05-09 05:49:23","catid":"54"}],"Categorie2":[{"created":"2017-03-21 08:58:37","catid":"59"},{"created":"2016-12-23 12:48:00","catid":"59"},{"created":"2016-12-08 09:57:10","catid":"59"}],"Categorie3":[],"Categorie4":[{"created":"2017-08-02 07:15:07","catid":"70"},{"created":"2017-08-01 08:03:00","catid":"70"},{"created":"2017-07-31 09:25:00","catid":"70"}],"Categorie5":[{"created":"2017-07-26 14:09:00","catid":"74"},{"created":"2017-06-29 14:03:00","catid":"74"},{"created":"2017-06-28 06:35:35","catid":"74"}]}';

我写了一个排序功能。基本上它会检查块(类别)是否获得最新条目并将该块置于顶部,对块进行排序):

$array = json_decode($json, true);
function custom($a, $b) {    
    foreach($a as $k => $v) {
        if (isset($b[$k])) {
            return (strtotime($a[$k]["created"]) <= strtotime($b[$k]["created"]));
        }
    }
}
uasort($array, "custom");

当我使用PHP 5打印它时,它是完美的:Categorie4是第一个块“。但是使用PHP 7它是非常的。

print("<pre>");
print_r($array); // PHP 5 is as expected, php 7 is not

我知道有哪些变化,但我不知道如何更改我的代码。 你们能帮助我改变代码吗?结果应该将categorie4显示为第一只猫......

THX家伙!

1 个答案:

答案 0 :(得分:0)

user-defined array sorting functions使用的回调函数必须返回<0的{​​{1}}整数值,$a < $b0 $a == $b何时>0。您将返回一个转换为$a > $b1的布尔值,但不会反映0$a的正确顺序。

从问题中如何对空条目($b)进行排序并不清楚,我认为它们的位置在最后。

试用PHP 5的代码:

Categorie3

uasort($array, function (array $a, array $b) { if (empty($a)) { return +1; } // empty arrays go to the end of the list if (empty($b)) { return -1; } return strcmp($a[0]['created'], $b[0]['created']); }); 的日期和时间值使用可以直接排序为字符串的格式,无需将它们转换为时间戳。

在PHP 7中,您可以使用新的<=> comparison operator,理论上它应该比strcmp()函数运行得更快,同时产生相同的结果。

created