首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP:递归迭代多维数组

PHP:递归迭代多维数组
EN

Stack Overflow用户
提问于 2019-11-26 01:55:50
回答 1查看 33关注 0票数 0

我有一个多维数组,如下所示:

代码语言:javascript
运行
复制
Array ( [text] => Level 0-0 => [children] => 
    Array ( 
    [0] => Array ( [text] => Level 1-0 0 => [children] => 
        Array ( 
        [0] => Array ( [text] => Level 2-0 0 => [children] => 
            Array ( 
            [0] => Array ( [text] => Level 3-0 0 ) 
            [1] => Array ( [text] => Level 3-1 0 ) 
            [2] => Array ( [text] => Level 3-2 0 ) 
            [3] => Array ( [text] => Level 3-3 0 ) 
            [4] => Array ( [text] => Level 3-4 0 ) 
            [5] => Array ( [text] => Level 3-5 0 ) ) ) 
        [1] => Array ( [text] => Level 2-1 0 ) 
        [2] => Array ( [text] => Level 2-2 0 => [children] => 
            Array ( 
            [0] => Array ( [text] => Level 3-0 2 ) ) ) 
        [3] => Array ( [text] => Level 2-3 0 ) 
        [4] => Array ( [text] => Level 2-4 0 ) 
        [5] => Array ( [text] => Level 2-5 0 => [children] => 
            Array ( 
            [0] => Array ( [text] => Level 3-0 5 ) 
            [1] => Array ( [text] => Level 3-1 5 ) 
            [2] => Array ( [text] => Level 3-2 5 ) 
            [3] => Array ( [text] => Level 3-3 5 ) 
            [4] => Array ( [text] => Level 3-4 5 ) 
            [5] => Array ( [text] => Level 3-5 5 ) ) ) 
        [6] => Array ( [text] => Level 2-6 0 ) 
        [7] => Array ( [text] => Level 2-7 0 ) 
        [8] => Array ( [text] => Level 2-8 0 ) 
        [9] => Array ( [text] => Level 2-9 0 => [children] => 
            Array ( 
            [0] => Array ( [text] => Level 3-0 9 ) 
            [1] ...
        [10] ...
    [1] ...
Array ( [text] => Level 0-1 => [children] => 
    Array ( 
    [0] => Array ( [text] => Level 1-0 1 => [children] => 
        Array ( 
        [0] => Array ( [text] => Level 2-0 1 => [children] => 
            Array ( 
            [0] => Array ( [text] => Level 3-0 0 ) 
            [1] ...
        [1] ...
    [1] ...
Array ...

和一个递归函数,列出每个[text] => Level x-x x

代码语言:javascript
运行
复制
function getTree(array $array) {
    foreach ($array as $key => $value) {
        echo $value['text']."<br>";
        if (!empty($value['children'])) {
            getTree($value['children']);
        }
    }
}

$array = array (...); //array listed above
$tree = getTree($array);
echo $tree;

这给了我一个类似如下的列表:

代码语言:javascript
运行
复制
Level 0-0
Level 1-0 0
Level 2-0 0
Level 3-0 0
Level 3-1 0
Level 3-2 0
Level 3-3 0
Level 3-4 0
Level 3-5 0
Level 2-1 0
Level 2-2 0
Level 3-0 2
Level 2-3 0
Level 2-4 0
Level 2-5 0
Level 3-0 5
Level 3-1 5
Level 3-2 5
Level 3-3 5
Level 3-4 5
Level 3-5 5
Level 2-6 0
Level 2-7 0
Level 2-8 0
Level 2-9 0
Level 3-0 9
...
...
...
Level 0-1
Level 1-0 1
Level 2-0 1
Level 3-0 0
...
...
...
...

但我想要的是以下代码,其中每一行都是根据其级别缩进的:

代码语言:javascript
运行
复制
Level 0-0
    Level 1-0 0
        Level 2-0 0
            Level 3-0 0
            Level 3-1 0
            Level 3-2 0
            Level 3-3 0
            Level 3-4 0
            Level 3-5 0
        Level 2-1 0
        Level 2-2 0
            Level 3-0 2
        Level 2-3 0
        Level 2-4 0
        Level 2-5 0
            Level 3-0 5
            Level 3-1 5
            Level 3-2 5
            Level 3-3 5
            Level 3-4 5
            Level 3-5 5
        Level 2-6 0
        Level 2-7 0
        Level 2-8 0
        Level 2-9 0
            Level 3-0 9
            ...
        ...
    ...
Level 0-1
    Level 1-0 1
        Level 2-0 1
            Level 3-0 0
            ...
        ...
    ...
...

我如何才能做到这一点呢?

我曾经考虑过包含一个递增的$counterif语句。然后是if (!empty($value['children'])) { $counter++; }。因此,如果counter为1,则在每行的开头添加一个缩进。如果counter为2,则添加两个缩进,依此类推。但是,在迭代每个数组的所有子数组之后,我需要在每个数组的末尾递减$counter--。这就是我逻辑上被卡住的地方。如何检查数组是否为数组中的最后一个数组?if (array is last array)) { $counter--; }

这个解决方案行得通吗?或者有没有我没有想到的更好的解决方案?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-26 02:17:07

一种简单的方法是在调用下一级时传入填充字符串添加制表符(或者,如果您愿意,也可以添加空格)。然后在你的输出之前回放它。

代码语言:javascript
运行
复制
function getTree(array $array, string $pad = '' ) {
    foreach ($array as $key => $value) {
        echo $pad.$value['text']."<br>";
        if (!empty($value['children'])) {
            getTree($value['children'], $pad."\t");
        }
    }
}

getTree($array);

因为您的getTree()函数不返回任何内容,所以不值得捕获并显示它的值。

正如我在评论中提到的,如果您以var_export()格式提供数组,将会有所帮助。这使得测试变得更容易,就像您当前的样本数据一样,将其转换为实际的数组是一件很痛苦的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59037585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档