foreach意外保留变量值的函数

时间:2015-11-13 16:26:38

标签: php arrays foreach scope

我正试图在嵌套的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”部分时被保留,而不是像我期望的那样被重置。

我重新阅读并重新阅读了代码并尝试了我能想到的每一条调试信息,但仍然没有得到正在发生的事情。我敢肯定它是基本的东西(或许是如此,如果我还没有看到它,我永远不会)或者我只是没有得到变量范围在这里工作。

1 个答案:

答案 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;
    }
}