php - 具有嵌套节点的递归数组解析

标签 php arrays recursion nodes

我脑子里有个黑洞。我正在尝试解析具有多级节点的数组。这是示例数组:

global $array;
$array = [
    '0' => [
        'id' => 1,
        'parent' => 0,
        'name' => 'root 0'
    ],
    '1' => [
        'id' => 2,
        'parent' => 1,
        'name' => 'root 1'
    ],
    '2' => [
        'id' => 3,
        'parent' => 2,
        'name' => 'root 2'
    ],
    '3' => [
        'id' => 4,
        'parent' => 3,
        'name' => 'root 3'
    ],
    '4' => [
        'id' => 5,
        'parent' => 3,
        'name' => 'root 4'
    ],
    '5' => [
        'id' => 6,
        'parent' => 2,
        'name' => 'root 2'
    ]
];

这应该像这样处理解析。具有父元素 3 的元素 3 应该具有父元素 1,因为元素 2 具有父元素 2 及其第一个子元素。

我尝试使用 foreach 和函数来实现这一点:

global $new_array;
$new_array = [];

foreach( $array as $item )
{
    if( $item['parent'] == 0 ) {
        $new_array[] = $item; // if parent 0 - clone into new array
        continue;
    }

    //echo $item['name'] . PHP_EOL;
    $new_array[] = check_parent( $item['parent'] ); 

}

print_r($new_array);

function check_parent( $parent )
{
    //echo '- check for parent of ' . $parent . PHP_EOL;
    global $array;
    foreach( $array as $item ) {
        if( $item['id'] == $parent && $item['parent'] == 0 ) {
            //echo '[OK] found root parent id: ' . $item['id'] . PHP_EOL;
            $item['parent'] = $item['id'];
            return $item;
        } else {
            return check_parent( $item['id'] );
        }
    }
}

我很困惑,但我没有看到我在哪里犯了错误。也许有人可以帮我看看 - 问题出在哪里。我花了几个小时来研究它,现在,我脑子里有黑洞。

fiddle : https://implode.io/jHS8m1

期望的输出:

$new_array = [
    '0' => [
        'id' => 1,
        'parent' => 0,
        'name' => 'root 0'
    ],
    '1' => [
        'id' => 2,
        'parent' => 1,
        'name' => 'root 1'
    ],
    '2' => [
        'id' => 3,
        'parent' => 2, // this should have after parse parent 1
        'name' => 'root 2'
    ],
    '3' => [
        'id' => 4,
        'parent' => 3, // this should have after parse parent 1
        'name' => 'root 3'
    ],
    '4' => [
        'id' => 5,
        'parent' => 3, // this should have after parse parent 1
        'name' => 'root 4'
    ],
    '5' => [
        'id' => 6,
        'parent' => 2, // this should have after parse parent 1
        'name' => 'root 2'
    ]
];

谢谢!

最佳答案

替换代码中的以下行

        $new_array[] = check_parent( $item['parent'] ); // get child

使用以下代码行。

        $temp = check_parent( $item['parent'] ); // get child
        $item['parent'] = $temp['id'];
        $new_array[] = $item;

发生的事情是您的 check_parent 正在返回 $item,它恰好是父级。然而,我们只对这个的 id 感兴趣。所以我们得到 id 并替换原来的 $item 中的父级。

这是工作 Demo

关于php - 具有嵌套节点的递归数组解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58182044/

相关文章:

javascript - 如何检查一个对象数组是否包含另一个对象数组的所有ID JS

java - 使用递归从列表中获取所有组合,包括使用相同数字的组合

javascript - 下拉自动选择页面到页面

php - laravel-Snappy PDF DIV 使用高度 :11in 大小不正确

php - 如何在php中从sql查询中检索单个值

c# - 从字节数组中删除前 4 位(左移)

c - C语言中如何向数组追加值

c++ - 递归克隆图时的stackoverflow

c - 返回函数本身作为返回值

php - 如何在不覆盖的情况下向 CSV 文件添加行