如何“展平”一个未知深度和长度的多维数组并记录它的父子关系?

我有一个如下所示的 PHP 数组:


Array

(

    [0] => Array

        (

            [id] => 2

            [name] => Item2

            [children] => Array

                (

                    [0] => Array

                        (

                            [id] => 1

                            [name] => Item1

                            [children] => Array

                                (

                                    [0] => Array

                                        (

                                            [id] => 5

                                            [name] => Item5

                                        )

                                )

                        )

                    [1] => Array

                        (

                            [id] => 4

                            [name] => Item4

                        )

                )

        )

    [1] => Array

        (

            [id] => 3

            [name] => Item3

        )

)

它具有未知(不可预测)的深度和长度。任何级别的任何项目都可能有也可能没有孩子。它是从包含产品组的 xml 文件创建的。我想将它转换为包含三个元素数组的数组:id、name 和 parent id:


[0] => array('id' => '2', 'name' => 'Item2', 'parent' => 0),

[1] => array('id' => '1', 'name' => 'Item1', 'parent' => 2),

[2] => array('id' => '4', 'name' => 'Item4', 'parent' => 2) etc.

我该怎么做?谢谢!


胡说叔叔
浏览 82回答 1
1回答

白衣非少年

这可以通过递归函数来实现,该函数从数组的给定级别推送所有项目,然后为任何children数组调用自身:function list_items($array, $parent = 0) {    $output = array();    foreach ($array as $arr) {        $output[] = array('id' => $arr['id'], 'name' => $arr['name'], 'parent' => $parent);        if (is_array($arr['children'] ?? NULL)) {            $output = array_merge($output, list_items($arr['children'], $arr['id']));        }    }    return $output;}$items = list_items($array);输出(对于我稍微扩展的数据):Array(    [0] => Array        (            [id] => 2            [name] => Item2            [parent] => 0        )    [1] => Array        (            [id] => 1            [name] => Item1            [parent] => 2        )    [2] => Array        (            [id] => 5            [name] => Item5            [parent] => 1        )    [3] => Array        (            [id] => 4            [name] => Item4            [parent] => 2        )    [4] => Array        (            [id] => 3            [name] => Item3            [parent] => 0        ))3v4l.org 上的演示更新原来是数组结构不一致;当只有一个孩子时,只存储孩子的值而不是单个元素数组。这可以通过检查数组以查看是否设置了id( Ид) 元素来处理,如果是,则在处理之前将数组推得更深一层:function list_items($array, $parent = 0) {    $output = array();    if (isset($array['Ид'])) {        $array = array($array);    }    foreach ($array as $arr) {        if (!is_array($arr)) echo $arr;        $output[] = array('id' => $arr['Ид'], 'name' => $arr['Наименование'], 'parent' => $parent);        if (is_array($arr['Группы']['Группа'] ?? NULL)) {            $output = array_merge($output, list_items($arr['Группы']['Группа'], $arr['Ид']));        }    }    return $output;}$items = list_items($array);print_r($items);3v4l.org 上的演示
打开App,查看更多内容
随时随地看视频慕课网APP