如何在php中迭代多级数组时获取导致给定值的所有键

时间:2012-11-13 23:20:28

标签: php arrays multidimensional-array

示例:

$arr = array(array("name"=>"Bob","species"=>"human","children"=>array(array("name"=>"Alice","age"=>10),array("name"=>"Jane","age"=>13)),array("name"=>"Sparky","species"=>"dog")));
print_r($arr);

array_walk_recursive($arr, function($v,$k) {
    echo "key: $k\n";
});

这里的事情是我只得到最后一个键,但是我无法引用我去过的地方,也就是存储一个特定的键并在我离开函数后更改值或在另一个相同的数组中更改相同的放置值

我必须得到的是一个数组,它将所有键都导致给定值,例如[0,"children",1,"age"]

编辑: 这个数组只是一个例子。我问过是否有通用的方法在PHP中迭代嵌套数组并获得完整的位置路径,而不仅仅是最后一个键。我知道有一种方法可以通过创建反映数组结构的嵌套循环来实现。但我再说一遍:我事先并不知道阵列结构。

1 个答案:

答案 0 :(得分:2)

要解决您的问题,您需要递归。以下代码将执行您想要的操作,如果存在,它还将找到多个路径:

$arr = array(
    array(
        "name"=>"Bob",
        "species"=>"human",
        "children"=>array(
            array(
                "name"=>"Alice",
                "age"=>10
            ),
            array(
                "name"=>"Jane",
                "age"=>13
            )
        ),
        array(
            "name"=>"Sparky",
            "species"=>"dog"
        )
    )
);

function getPaths($array, $search, &$paths, $currentPath = array()) {
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            $currentPath[] = $key;
            if (true !== getPaths($value, $search, $paths, $currentPath)) {
                array_pop($currentPath);
            }
        } else {
            if ($search == $value) {
                $currentPath[] = $key;
                $paths[] = $currentPath;
                return true;
            }
        }
    }
}

$paths = array();
getPaths($arr, 13, $paths);
print_r($paths);