数组使用数组或字符串推送多个键

时间:2013-09-23 06:40:34

标签: php arrays multidimensional-array array-push

我有以下数组:

$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'];

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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. 如果不再应用密钥则停止。