【发布时间】:2011-11-27 06:53:04
【问题描述】:
有人可以帮助我提供一些关于如何递归遍历数组以及在到达最后一个元素时打印到它的完整路径的代码或说明吗?一个简单的 echo 就可以了,因为我会将代码调整为我正在开发的其他功能。
函数不需要计算数组维度,因为这个参数会被传递:
例子:
$depth = 8;
$array[1][3][5][6][9][5][8][9];
当函数到达第 8 个元素时,它会打印到它的所有路径:
//print path
'1 -> 3 -> 5 -> 6 -> 9 -> 5 -> 8 -> 9'
正如我所说,只有以这种格式打印才有效,因为我会将代码实现到其他函数中。
数组键可以具有相同的值。对于整个数组,显然不是同一个序列中的同一个值。
更新:
递归遍历函数:
$someArray[1][2][3] = 'end';
$someArray[1][2][6] = 'end';
$someArray[1][3][6] = 'end';
$someArray[4][3][7] = 'end';
function listArrayRecursive(&$array_name, $ident = 0){
if (is_array($array_name)){
foreach ($array_name as $k => &$v){
if (is_array($v)){
for ($i=0; $i < $ident * 10; $i++){ echo " "; }
echo $k . " : " . "<br>";
listArrayRecursive($v, $ident + 1);
}else{
for ($i=0; $i < $ident * 10; $i++){ echo " "; }
echo $k . " : " . $v . "<br>";
}
}
}else{
echo "Variable = " . $array_name;
}
}
listArrayRecursive($someArray);
将打印:
1 :
2 :
3 : end
6 : end
3 :
6 : end
4 :
3 :
7 : end
现在,我怎样才能在每次到达末尾时打印数组的路径?例如:
1 :
2 :
3 : end : path -> 1,2,3
6 : end : path -> 1,2,6
3 :
6 : end : path -> 1,3,6
4 :
3 :
7 : end : path -> 4,3,7
添加第三个参数以记录路径的编辑代码:
$someArray[1][2][3] = 'end';
$someArray[1][2][6] = 'end';
$someArray[1][3][6] = 'end';
$someArray[4][3][7] = 'end';
$someArray[3][2] = 'end';
function listArrayRecursive(&$array_name, $ident = 0, $path = null){
foreach ($array_name as $k => &$v){
if (is_array($v)){
for ($i=0; $i < $ident * 10; $i++){ echo " "; }
echo $k . " : " . "<br>";
$path .= $k . ', ';
listArrayRecursive($v, $ident + 1, $path);
}else{
for ($i=0; $i < $ident * 10; $i++){ echo " "; }
echo $k . " : " . $v . ' - path -> ' . $path . "<br>";
}
}
}
listArrayRecursive($someArray);
将打印:
1 :
2 :
3 : end - path -> 1, 2,
6 : end - path -> 1, 2,
3 :
6 : end - path -> 1, 2, 3,
4 :
3 :
7 : end - path -> 1, 4, 3,
3 :
2 : end - path -> 1, 4, 3,
【问题讨论】:
-
嗯,用递归解决是基本任务。你试过什么?
-
@zerkms 实际上我有这个递归代码codepad.org/iyrcdfQP 但我坚持跟踪当前 $key 的路径。
-
你能举一个更清楚的例子吗,如果数组的任何给定深度内的多个项目,或者如果数组没有像
$depth那样嵌套那么深?这解决了什么问题? -
@NullUserExceptionఠ_ఠ 是的,它永远不会有那么深,只是想说明一下。当我开始使用脚本时,我会遇到的最大深度可能是 3 个级别。如果你检查上面评论中的代码,你会看到我在做什么。
标签: php arrays recursion multidimensional-array