【问题标题】:PHP usort tree arrayPHP 排序树数组
【发布时间】: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 应该是(单=)吧?

标签: php sorting recursion


【解决方案1】:

这不起作用,因为usort() 不会通过引用传递数组元素,即使您已经使用&amp; 声明了参数。我补充说:

$a['touched'] = true;

到比较功能,当我打印结果时,这些键无处可寻。

但是,即使它有效,这似乎也是一种非常糟糕的方法,因为它会对子项进行多次排序——每次将父项与另一个父项进行比较时,它都必须重新对子项进行排序子孙等。

最好编写一个递归函数,对一级排序,然后遍历子级,依此类推。

function sortRecurse(&$array) {
    usort($array, function($a, $b) {
        return $a['timestamp'] - $b['timestamp'];
    });
    foreach ($array as &$subarray) {
        sortRecurse($subarray['children']);
    }
}

DEMO

【讨论】:

  • 我是这么想的,但这也没有正确排序。
  • @JustinusHermawan 它不起作用,因为元素没有通过引用传递给比较函数。所以上面Kaspar的评论是正确的。
  • @barmar 是的,它有效。所以,这里的错误是usort() 函数没有通过引用检索参数,对吧?
  • 通过引用获取自己的参数,但不通过引用将参数传递给比较函数。
  • 太糟糕了,我迟到了sandbox.onlinephpfunctions.com/code/…
猜你喜欢
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 2017-02-18
相关资源
最近更新 更多