使用另一个数组搜索多维数组的键

时间:2011-11-24 19:14:18

标签: php arrays multidimensional-array

是否有一种优雅的方法可以使用另一个数组从大型多维数组中获取值,以便查找键?

e.g。

$cats[A][A1][A11][A111] = $val;
$cats[A][A1][A11][A112] = $val;
$cats[A][A1][A12] = $val;
$cats[A][A1][A12][A121] = $val;
$cats[A][A2] = $val;
$cats[A][A2][A21] = $val;
$cats[A][A2][A22] = $val;
$cats[A][A2][A22][A221] = $val;
$cats[A][A2][A22][A222] = $val;

使用$cats

访问$keys = Array ('A', 'A2', 'A22', 'A221');的值

不检查$keys的长度并执行类似......

的操作
switch (count($keys)) {
   case 1: $val = $cats[$keys[0]]; break;
   case 2: $val = $cats[$key[0]][$key[1]]; break;
   case 3: $val = $cats[$key[0]][$key[1]][$key[2]]; break;
   ...
}
非常感谢。

3 个答案:

答案 0 :(得分:0)

为什么不使用递归?像这样:

function get_val($array, $keys) {
    if(empty($keys) || !is_array($keys) || !is_array($array)) return $array;
    else {
        $first_key = array_shift($keys);
        return get_val($array[$first_key], $keys);
    }
}

我最初把它写在一个循环中,但由于某种原因将其改为递归。正如yeoman所说,这是正确的,递归函数比循环更可能导致堆栈溢出,特别是如果你的数组足够大(PHP确实支持结束递归),所以这里有一个循环应该达到同样的目的:

// given a multidimensional array $array and single-dimensional array of keys $keys
$desired_value = $array;
while(count($keys) > 0) {
    $first_key = array_shift($keys);
    $desired_value = $desired_value[$first_key];
}

答案 1 :(得分:0)

到目前为止这很好。否则,您需要遍历数组并检查深度。为了使它动态,我确信你在构造$ cats时将键添加到$ keys数组中。使用递归也解决方案它将需要更多的步骤,更多的内存。

答案 2 :(得分:0)

jburbage建议使用递归原则上是可以的,但据我所知,PHP不支持结束递归。

问题是关于“大规模”的多维数组。

由于“大规模”表明除了很好的整体大小之外还有很大的深度,因此通过这种解决方案可能会遇到堆栈溢出,因为通常可以在堆上创建比堆栈可以处理更深的数据结构。递归。

在这种情况下,从性能的角度来看,这种方法也是不可取的。

简单地重构jburbage的递归解决方案,在循环中工作,你几乎就在那里: - )

这是jburbage的原始建议代码:

function get_val($array, $keys) {
    if(empty($keys) || !is_array($keys) || !is_array($array)) return $array;
    else {
        $first_key = array_shift($keys);
        return get_val($array[$first_key], $keys);
    }
}