将多维嵌套PHP数组重塑为另一种格式

时间:2016-08-12 10:47:17

标签: php arrays multidimensional-array

我有一个多维嵌套数组:

$arr = array(
    'name'      => 'Root Node',
    'children'  => array(
        array(
            'name'      => 'Node A',
            'children'  => array(
                array(
                    'name'      => 'Node A.1',
                    'children'  => array(
                        array(
                            'name'      => 'Node A.1.1',
                            'children'  => ''
                        ),
                    ),
                ),

                array(
                    'name'      => 'Node A.2',
                    'children'  => ''
                ),
            ),
        ),

        array(
            'name'      => 'Node B',
            'children'  => array(
                array(
                    'name'      => 'Node B.1',
                    'children'  => '',
                ),

                array(
                    'name'      => 'Node B.2',
                    'children'  => ''
                ),
            )
        ),

        array(
            'name'      => 'Node C',
            'children'  => ''
        )
    ),
);

目前这个数组最多有4个级别,但我们不能将其深度级别静态设为4,因为它也可能有N个级别。我的目标是将每个关系的单个行数组转换为此数组,如:

$arr = array(
    array( 'Root Node', 'Nodel A', 'Node A.1', 'Node A.1.1' ),
    array( 'Root Node', 'Nodel A', 'Node A.2' ),
    array( 'Root Node', 'Nodel B', 'Node B.1' ),
    array( 'Root Node', 'Nodel B', 'Node B.2' ),
    array( 'Root Node', 'Nodel C' ),
);

我知道一个递归函数应该可以做到这一点,但是我无法弄清楚它是不是我在开始时想的那么容易。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

使用以下代码段。它应该可以解决你的问题。

function makeTreeArr($arr){ 
    $mainarr = []; 
    $tmparr = []; 
    function iterateChildren(&$mainarr,&$tmparr,$node){ 
        $tmparr[] = $node['name']; 
        if(is_array($node['children'])){ 
            foreach($node['children'] as $child){ 
                iterateChildren($mainarr,$tmparr,$child) ;     
            } 
        }else{ 
            $mainarr[] = $tmparr; 
        } 
        array_pop($tmparr ); 
    } 
   iterateChildren($mainarr,$tmparr,$arr); 
   return $mainarr; 
} 
$newarr = makeTreeArr($arr); 

答案 1 :(得分:0)

按照以下协议获取您指定的元素。

$name0=$arr['name'];
$in1=$arr['children'];
foreach($in1 as $key=>$value)
{
echo $name0.", ";
echo $name1=$in1[$key]['name'].", ";
$in2=$arr['children'][$key]['children'];
    foreach($in2 as $k2=>$v2)
    {
        echo $name2=$in2[$k2]['name'].", ";
        $in3=$arr['children'][$key]['children'][$k2]['children'];
        foreach($in3 as $k3=>$v3)
        {
           echo  $name3=$in3[$k3]['name'].", ";
        }
    }
    echo "</br>";
}

输出: -

  

根节点,节点A,节点A.1,节点A.1.1,节点A.2,

     

根节点,节点B,节点B.1,节点B.2,

     

根节点,节点C,