2013-09-23 16 views
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']; 

回答

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

你可以尝试递归函数:

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. 如果没有更多键,则停止d应用。