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 回答