我正试图在嵌套的PHP数组中抓取并打印从root到leaf的所有路径。例如,如果这是我的数组:
$tree = array(
"A" => "w",
"B" => array("x" => array("y", "z"))
)
我想要以下输出:
Array
(
[0] => Aw
[1] => Bxy
[2] => Bxz
)
这是我目前的职能:
function traverse($input, $myPath) {
global $allPaths;
if(is_array($input)) {
foreach($input as $k => $v) {
if(!is_int($k)) $myPath .= $k;
traverse($v, $myPath);
}
} else {
$myPath .= $input;
$allPaths[] = $myPath;
}
}
当我运行此代码时:
$allPaths = array();
echo "<pre>";
traverse($tree, "");
print_r($allPaths);
echo "</pre>";
输出是这样的:
Array
(
[0] => Aw
[1] => ABxy
[2] => ABxz
)
这几乎是正确的,但由于某种原因,A在到达“B”部分时被保留,而不是像我期望的那样被重置。
我重新阅读并重新阅读了代码并尝试了我能想到的每一条调试信息,但仍然没有得到正在发生的事情。我敢肯定它是基本的东西(或许是如此,如果我还没有看到它,我永远不会)或者我只是没有得到变量范围在这里工作。
答案 0 :(得分:1)
对函数的第一次调用在顶级数组上运行,因此总是会追加顶级键。
要修复此问题,请将$myPath
的副本传递给递归调用的$k
,而不是直接附加到$myPath
:
function traverse($input, $myPath) {
global $allPaths;
if(is_array($input)) {
foreach($input as $k => $v) {
if(!is_int($k)){
traverse($v, $myPath . $k);
}else{
traverse($v, $myPath);
}
}
} else {
$myPath .= $input;
$allPaths[] = $myPath;
}
}