1

例:

$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 でネストされた配列を反復処理し、最後のキーだけでなく完全な場所のパスを取得する普遍的な方法があるかどうかを尋ねました。そして、配列の構造を反映するネストされたループを作成することで、これを行う方法があることを知っています。しかし繰り返しますが、私は配列構造を事前に知りません。

4

1 に答える 1

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);
于 2012-11-14T10:34:05.273 に答える