php - PHP 排序树数组
问题描述
我想根据一个键(在本例中:时间戳)对具有如下结构的树层次结构数组进行排序。
$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()
不会通过引用传递数组元素,即使您已使用&
. 我补充说:
$a['touched'] = true;
到比较功能,当我打印结果时,这些键无处可寻。
然而,即使它有效,这似乎也是一种非常糟糕的方法,因为它会对孩子进行多次排序 - 每次将父母与另一个父母进行比较时,它都必须重新排序孩子,并且孙子等
最好编写一个递归函数,对一级进行排序,然后遍历子级,依此类推。
function sortRecurse(&$array) {
usort($array, function($a, $b) {
return $a['timestamp'] - $b['timestamp'];
});
foreach ($array as &$subarray) {
sortRecurse($subarray['children']);
}
}
推荐阅读
- spring - 如何从 spring application.yml 读取属性并在我的 log4j2.xml 中使用它
- android - 使用 Jetpack Navigation 在深度链接 URI 中使用字符串常量
- google-drive-api - 将上传的标签值设置为谷歌驱动器中的服务帐户名称
- javascript - 我无法使用节点 js 向 hazelcast 图像集群添加超过 3 个数据
- jupyter-notebook - 我的 Bloch 球体显示为椭圆/椭圆
- heroku - 在heroku中将Json文件设置为环境变量
- angularjs - TypeError:在 forEach 内部使用时无法读取 Angular 项目中未定义的属性“****”
- python - 如何在我的 python Jupyter Notebook 上使用 ImageMagick 制作动画?
- javascript - 如何在输入中更改焦点
- linux - 如何在fish脚本中用2个数组更改一些文本?