1

次の配列があります。

$array = array('23' => array('19' => array('7' => array('id' => 7, 'name' => 'John Doe'))));

Array
(
    [23] => Array
        (
            [19] => Array
                (
                    [7] => Array
                        (
                            [id] => 7
                            [name] => John Doe
                        )

                )

        )

)

サブ要素にアクセスしたいのですが、そのサブキーを知っています23 19 7。シンプルなフォーマットでこれを行うことができます

echo $array['23']['19']['7']['name']; // John Doe

しかし、これらの配列には 3 つのレベルしかなく、これは多かれ少なかれ異なる場合があります。配列を作成する必要がありunlimited levelます。

次のコードで好きなように試しました:

$keys =  array('23', '19', '7');

echo $array[$keys]['name'];

もちろん、Warning: Illegal offset type inエラーが発生しました。

次に、これを試しましたが、要素を取得できませんでした:

function brackets($str) {
    return sprintf("['%s']", $str);
}

$keys =  array('23', '19', '7');
$string_key = implode('', array_map('brackets', $keys)); // ['23']['19']['7']

echo $array{$string_key}['name'];
4

2 に答える 2

1

キー配列で呼び出すことができる関数を作成できます。

function getArrayPathVal($arr, $path){

    if(!is_array($path))
        return $arr[$path];

    $curr = $arr;
    foreach($path as $key)
    {
        if(!$curr[$key])
            return false;

        $curr = $curr[$key];
    }

    return $curr;
}


$array = array('23' => array('19' => array('7' => array('id' => 7, 'name' => 'John Doe'))));
$keys =  array('23', '19', '7');

$res = getArrayPathVal($array, $keys);
print $res['name']; //Prints 'John Doe'
于 2013-09-23T06:50:32.950 に答える
1

再帰関数を試すことができます:

function getByKeys ($arr, $keys) {
  if (count($keys) == 0)
    return $arr;
  $key = array_shift ($keys);
  return getByKeys ($arr[$key], $keys);
}

$array = array('23' => array('19' => array('7' => array('id' => 7, 'name' => 'John Doe'))));
echo getByKeys ($array, array('23', '19', '7'));

これはテストされていませんが、コンセプトはうまくいくはずです:

  1. 配列に適用される次のキーを取得する
  2. そのキーによって示されるサブ配列を使用した次の反復
  3. これ以上キーを適用しない場合は停止します。
于 2013-09-23T06:55:58.773 に答える