PHP将嵌套的多维数组分解为单个多维数组



我想在简单的关联数组中打破下面的嵌套数组。

输入

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Gadgets
            [code] => gadget
            [parent_id] => 
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [name] => Mobile
                            [code] => mobile
                            [parent_id] => 1
                            [children] => Array
                                (
                                )
                        )
                    [1] => Array
                        (
                            [id] => 3
                            [name] => Laptops
                            [code] => laptop
                            [parent_id] => 1
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 4
                                            [name] => Dell
                                            [code] => dell
                                            [parent_id] => 3
                                            [children] => Array
                                                (
                                                )
                                        )
                                    [1] => Array
                                        (
                                            [id] => 5
                                            [name] => Lenovo
                                            [code] => lenovo
                                            [parent_id] => 3
                                            [children] => Array
                                                (
                                                )
                                        )
                                )
                        )
                )
        )
)

输出

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Gadgets
            [code] => gadget
            [parent_id] => 
        )
    [1] => Array
        (
            [id] => 2
            [name] => Mobile
            [code] => mobile
            [parent_id] => 1
        )
    [2] => Array
        (
            [id] => 3
            [name] => Laptops
            [code] => laptop
            [parent_id] => 1
        )
    [3] => Array
        (
            [id] => 4
            [name] => Dell
            [code] => dell
            [parent_id] => 3
        )
    [4] => Array
        (
            [id] => 5
            [name] => Lenovo
            [code] => lenovo
            [parent_id] => 3
        )
)

需要帮助从给定数组中生成此类型的数组。我在for循环中尝试了很多东西,但当有很多嵌套数组并且该解决方案不适合我的需求时,就会陷入困境。

有一个根节点,其他节点是子节点,许多父节点可以有子节点。

有很多方法可以做到这一点,这里有几个简单的例子。如果你不这样做;不关心维护秩序,递归函数非常简单。如果在遍历树时确实需要维护元素的顺序(例如,将它们渲染为表(,那么这就有点麻烦了。

<?php
function flattenTree($array)
{
    $output = [];
    foreach($array as $currBranch)
    {
        if(!empty($currBranch['children']))
        {
            $children = flattenTree($currBranch['children']);
            $output = array_merge($output, $children);
        }
        unset($currBranch['children']);
        $output[] = $currBranch;
    }
    return $output;
}
function flattenTreeMaintainingOrder($array)
{
    $output = [];
    foreach($array as $currBranch)
    {
        $children = (array_key_exists('children', $currBranch)) ? $currBranch['children']:[];
        unset($currBranch['children']);
        $output[] = $currBranch;
        if(!empty($children))
        {
            $children = flattenTreeMaintainingOrder($children);
            $output = array_merge($output, $children);
        }
    }
    return $output;
}
$flat = flattenTree($array);
$flatOrdered = flattenTreeMaintainingOrder($array);
print_r($flat) . PHP_EOL;
print_r($flatOrdered) . PHP_EOL;

递归函数是一个选项。。。

function extractChildren($parent, $farr) {
 $children = $parent['children'];
 if (!$children || count($children)==0) return $farr;
 unset($parent['children']);
 $farr[]= $parent;
 return extractChildren($children, $farr);
}
$finalarray=array(); 
// $array is the array you have in your question 
foreach ($array as $parent) {
 $finalarray = extractChildren($parent, $finalarray);
}

正如@El_Vanya上面提到的,这里有很多其他方法可以实现这一点:如何压平多维数组?

最新更新