【问题标题】:Create array tree of nth level form array list创建第 n 级形式数组列表的数组树
【发布时间】:2020-01-07 00:33:33
【问题描述】:

我只有第N个层次数组返回,这个函数返回所有子列表

$arr = array(
array('id'=>100, 'parentid'=>0, 'name'=>'a'),


array('id'=>101, 'parentid'=>100, 'name'=>'a'),
  array('id'=>102, 'parentid'=>101, 'name'=>'a'),
  array('id'=>103, 'parentid'=>101, 'name'=>'a'),
);

$new = array();
foreach ($arr as $a){
    $new[$a['parentid']][] = $a;
}
$tree = createTree($new, array($arr[0]));
print_r($tree);

function createTree(&$list, $parent){
    $tree = array();
    foreach ($parent as $k=>$l){
        if(isset($list[$l['id']])){
            $l['children'] = createTree($list, $list[$l['id']]);
        }
        $tree[] = $l;
    } 
    return $tree;
}

此函数返回数组中的所有数据。

此函数返回不能返回特定级别完成然后中断并返回值

【问题讨论】:

标签: php arrays recursion tree binary-tree


【解决方案1】:

像这样试试。

$array = array(
    array('id'=>100, 'parentid'=>0, 'name'=>'a'),
    array('id'=>101, 'parentid'=>100, 'name'=>'a'),
    array('id'=>102, 'parentid'=>101, 'name'=>'a'),
    array('id'=>103, 'parentid'=>101, 'name'=>'a')
);

echo '<pre>';
print_r(array_to_tree($array));
exit;

转换树的功能。

function array_to_tree(array $array, $parent_id = 0)
{
    $array = array_combine(array_column($array, 'id'), array_values($array));

    foreach ($array as $k => &$v) {
        if (isset($array[$v['parentid']])) {
            $array[$v['parentid']]['children'][$k] = &$v;
        }
        unset($v);
    }

    return array_filter($array, function($v) use ($parent_id) {
        return $v['parentid'] == $parent_id;
    });
}

输出将是。

根据您的要求,您只需要 2 个级别,然后不要使用递归函数。 //从foreach中删除createTree

function createTree(&$list, $parent){
    $tree = array();
    foreach ($parent as $k=>$l){
        if(isset($list[$l['id']])){
            $l['children'] = $list[$l['id']]; //remove createTree from here.
        }
        $tree[] = $l;
    } 
    return $tree;
}

【讨论】:

  • 谢谢,这是 3 个级别的节目,但我只显示了 2 个级别 100 和 101,我无法显示 102 和 103
  • 您的数组有 3 个子级对吗?为什么你只想要 2 个级别?如果你这样做,那么在每个数组中你只会得到 2 个级别。
  • 您的数组有 3 个子级对吗?为什么你只想要 2 个级别?如果你这样做,那么在每个数组中你只会得到 2 个级别是的
  • 函数 createTree(&$list, $parent){ $tree = array(); foreach ($parent as $k=>$l){ if(isset($list[$l['id']])){ $l['children'] = createTree($list, $list[$l[ 'ID']]); } $tree[] = $l; } 返回$树; } 返回相同的输出
【解决方案2】:

这会预处理输入数据,以便处理它们的顺序是父 ID 降序然后 ID 升序。这意味着您可以一次累积所有菜单(代码中的一些 cmets)...

$array = array(
    array('id'=>100, 'parentid'=>0, 'name'=>'a'),
    array('id'=>101, 'parentid'=>100, 'name'=>'a'),
    array('id'=>102, 'parentid'=>101, 'name'=>'a'),
    array('id'=>103, 'parentid'=>101, 'name'=>'a')
);

print_r(array_to_tree($array));

function array_to_tree ( array $input ): array {
    $new = [];
    // Sort data in reverse order of parent ID, normal order of ID within parent ID
    usort($input, function ( $a, $b ) {
        return ( $a['parentid'] == $b['parentid'] )? 
            $a['id']- $b['id']:
            $b['parentid'] - $a['parentid'];
    });
    foreach ( $input as $inp )  {
        // Add data to parent ID
        $new[$inp['parentid']][$inp['id']] = $inp;
        // If data already exists for this ID, then this is also a parent
        if ( isset( $new[$inp['id']]) )   {
            // Add existing data to new item and remove old one
            $new[$inp['parentid']][$inp['id']] += $new[$inp['id']];
            unset($new[$inp['id']]);
        }
    }

    return $new;
}

【讨论】:

    猜你喜欢
    • 2011-05-10
    • 1970-01-01
    • 2016-08-08
    • 2018-06-02
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多