【问题标题】:Sorting array for every child coming after parent为每个在父母之后的孩子排序数组
【发布时间】:2012-11-19 14:57:08
【问题描述】:

我有一个这样的数组:

<?php
array(
    array(
        'id' => 1,
        'parent_id' => null
    ),
    array(
        'id' => 2,
        'parent_id' => 1
    ),
    array(
        'id' => 3,
        'parent_id' => null
    ),
    array(
        'id' => 4,
        'parent_id' => 2
    )
)

我需要将它排序到每个孩子的直系父母之后。所以,ID 4 的项目应该紧跟在 ID 2 之后。

谢谢。

【问题讨论】:

  • 一个父母可以有多个孩子吗?如果是这样,如何解决?
  • null 父母的优先级是什么?他们排在孩子之上吗?即 1=>null,3=>null,2=>1,4=>2。或者是孩子们之后预期的空值?即 1=>null,2=>1,4=>2,3=>null
  • 当然可以。我正在从这个数组构建一个 UL LI 列表,但我不想使用递归函数,所以如果孩子在父母之后,它会更容易。
  • NULL 是根节点。所以他们应该先来。
  • 我等了 5 分钟才接受您的解决方案 :)

标签: php arrays sorting parent-child


【解决方案1】:

此工作解决方案适用于 array_multisort()

尝试:

$data = array(
    array(
        'id' => 1,
        'parent_id' => null
    ),
    array(
        'id' => 2,
        'parent_id' => 1
    ),
    array(
        'id' => 3,
        'parent_id' => null
    ),
    array(
        'id' => 4,
        'parent_id' => 2
    )
);

$parent_ids = array();
foreach ($data as $item) {
    $parent_ids[]  = $item['parent_id'];
}

array_multisort($parent_ids, SORT_ASC, $data);

如果您希望 null 值位于末尾,请将 foreach 替换为:

foreach ($data as $item) {
    if (is_null($item['parent_id'])) {
        $item['parent_id'] = PHP_INT_SIZE;
    }
    $parent_ids[]  = $item['parent_id'];
}

查看结果:print_r($data);

【讨论】:

  • 是的。多选为赢。
【解决方案2】:

工作解决方案:PHP 有用户自定义排序功能uasort 我已经用它来对你的数组进行排序。

<?php
$data = array(
    array(
        'id' => 1,
        'parent_id' => null
    ),
    array(
        'id' => 2,
        'parent_id' => 1
    ),
    array(
        'id' => 3,
        'parent_id' => null
    ),
    array(
        'id' => 4,
        'parent_id' => 2
    )
);



function cmp($a, $b) {    
    if ($a['parent_id'] == $b['parent_id']) {
        return 0;
    }
    return ($a['parent_id'] < $b['parent_id']) ? -1 : 1;
}

uasort($data, 'cmp');
echo '<pre>';
print_r($data);
echo '</pre>';

【讨论】:

  • 如果 parent_id 是 GUID 怎么办?
猜你喜欢
  • 2019-12-01
  • 1970-01-01
  • 2010-12-10
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多