通过一系列的键获取多维数组中的值

5

如果有一个数组$array

和键序列$keys = array('key1','key2','key3')

如何获得$array[$keys[1]][$keys[2]][$keys[3]],因为键的数量不确定,可能有4个键,也可能只有1个键等。

我的代码目前是:

switch(count($keys)) {
    case 1:
        if(array_isset($array[$keys[0]]), $array)
            $value = $array[$keys[0]];
        break;
    case 2:
        if(array_isset($array[$keys[0]][$keys[1]]), $array[$keys[0]])
            $value = $array[$keys[0]][$keys[1]];
        break;
    case 3:
        if(array_isset($array[$keys[0]][$keys[1]][$keys[2]]), $array[$keys[0]][$keys[1]])
            $value = $array[$keys[0]][$keys[1]][$keys[2]];
        break;
    case 4:
        if(array_isset($array[$keys[0]][$keys[1]][$keys[2]][$keys[3]]), $array[$keys[0]][$keys[1]][$keys[2]])
            $value = $array[$keys[0]][$keys[1]][$keys[2]][$keys[3]];
        break;
    default:
        break;
}

function array_isset($key, Array $array) {
  if(isset($array[$key])) {
    return true;
  }
  return array_key_exists($key, $array);
}

有更好的想法吗?我不想使用eval函数


更新,根据Alma Do Mundo的建议,最终代码如下:

$result = $array[$keys[0]];
for($i=1;$i<count($keys);$i++) {
    if(array_isset($keys[$i], $result))
        $result = $result[$keys[$i]];
    else {
        $result = null;
        break;
    }
}

2
敢问,eval 也许可以与 implode() 结合使用,尽管无疑还有其他解决方案,但这可能是最快的(如果正确实现,则仍然安全)。 - MDEV
是的,在这里 eval 可以起作用 - 另一种选择是递归地执行:首先访问 $array[$key[1]],然后在其中访问 key2 等。 - CBroe
1个回答

3

使用简单循环:

//for PHP <=5.3 replace short [] to array()
$rgData   = ['key1'=>['key2'=>['key3'=>'test', 'key4'=>'data'], 'key5'=>'done']];
$rgKeys   = ['key1','key2','key3'];
$rgResult = $rgData[$rgKeys[0]];
for($i=1; $i<count($rgKeys); $i++)
{
   $rgResult=$rgResult[$rgKeys[$i]];
}

虽然使用eval可能是一种选项,但我建议避免使用eval


1
这很聪明,比我的好多了! - Edward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接