【发布时间】:2019-01-16 13:17:51
【问题描述】:
我想根据一个键(在本例中为:timestamp)对具有如下结构的树层次结构数组进行排序。
$topics = array(
array('name' => 'n1', 'timestamp' => 5000, 'children' => array()),
array('name' => 'n2', 'timestamp' => 4000, 'children' => array(
array('name' => 'n3', 'timestamp' => 6000, 'children' => array()),
array('name' => 'n4', 'timestamp' => 2000, 'children' => array(
array('name' => 'n5', 'timestamp' => 4000, 'children' => array()),
array('name' => 'n6', 'timestamp' => 3000, 'children' => array())
)),
)),
array('name' => 'n7', 'timestamp' => 1000, 'children' => array())
);
我的排序功能:
function sequenceSort(&$a, &$b) {
if (!empty($a['children'])) {
usort($a['children'], 'sequenceSort');
}
if ($a['timestamp'] == $b['timestamp']) {
return 0;
}
return $a['timestamp'] < $b['timestamp'] ? -1 : 1;
}
usort($topics, 'sequenceSort');
print_a($topics);
在某些层面上它会产生正确的输出,而在另一些层面上却不会,例如:
1000 ✔
4000 ✔
6000 ✘
2000 ✘
4000 ✘
3000 ✘
5000 ✔
这是怎么回事?
【问题讨论】:
-
你不能修改
usort中的数组 -
@kaspars 我使用传递引用来实现这一点。
-
请注意,您应该对输入数组进行不同的排序,以查看它是否真的排序。第二级现在也失败了,但你看不到,因为你已经正确排序了。
-
@jeroen 我用更随机的输入顺序编辑了问题。
-
@emix 应该是(单=)吧?