我有一个多维数组,如下所示:
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
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;
这给了我一个类似如下的列表:
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
...
...
...
...
但我想要的是以下代码,其中每一行都是根据其级别缩进的:
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
...
...
...
...
我如何才能做到这一点呢?
我曾经考虑过包含一个递增的$counter
和if
语句。然后是if (!empty($value['children'])) { $counter++; }
。因此,如果counter为1,则在每行的开头添加一个缩进。如果counter为2,则添加两个缩进,依此类推。但是,在迭代每个数组的所有子数组之后,我需要在每个数组的末尾递减$counter--
。这就是我逻辑上被卡住的地方。如何检查数组是否为数组中的最后一个数组?if (array is last array)) { $counter--; }
这个解决方案行得通吗?或者有没有我没有想到的更好的解决方案?
发布于 2019-11-26 02:17:07
一种简单的方法是在调用下一级时传入填充字符串添加制表符(或者,如果您愿意,也可以添加空格)。然后在你的输出之前回放它。
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()
格式提供数组,将会有所帮助。这使得测试变得更容易,就像您当前的样本数据一样,将其转换为实际的数组是一件很痛苦的事情。
https://stackoverflow.com/questions/59037585
复制相似问题