我有一个这样的数组:
$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家伙!
答案 0 :(得分:0)
user-defined array sorting functions使用的回调函数必须返回<0
的{{1}}整数值,$a < $b
或0
$a == $b
何时>0
。您将返回一个转换为$a > $b
或1
的布尔值,但不会反映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