【问题标题】:Reshape multidimensional nested PHP array to another format将多维嵌套 PHP 数组重塑为另一种格式
【发布时间】:2016-08-22 20:26:49
【问题描述】:

我有一个多维嵌套数组:

$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' ),
);

我知道递归函数应该可以解决问题,但我无法弄清楚,因为它并不像我一开始想的那么容易。任何帮助将不胜感激!

【问题讨论】:

  • 你有没有尝试过?
  • 使用 foreach 获取所有元素。在 foreach 里面把值放在桌子上
  • 我尝试了 foreach 和递归函数来使其工作,但无法弄清楚

标签: php arrays multidimensional-array


【解决方案1】:

使用以下代码 sn-p。它应该可以解决您的问题。

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); 

【讨论】:

  • 有效!非常感谢您的努力。但是,我将功能进一步缩短为:function iterateChildren( $node, $mainarr, $tmparr ) { $tmparr[] = $node['name']; if( is_array( $node['children'] ) ) { foreach($node['children'] as $child){ $mainarr = iterateChildren( $child, $mainarr, $tmparr ); } } else { $mainarr[] = $tmparr; } array_pop( $tmparr ); return $mainarr; }
【解决方案2】:

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

$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,

【讨论】:

  • 感谢您的尝试。查看代码 sn-p,它似乎仅限于三个级别,仅在我需要它接受任意数量的级别时。
  • 这是指定的 4 级
  • 不管是 3 级还是 4 级,直到它与脚本保持静态。对于 100 个深度级别,我们不能重复 foreach 直到 100 次。
猜你喜欢
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多