是否有一种优雅的方法可以使用另一个数组来查找键,从一个大规模的多维数组中获取值?
。
$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;
使用$keys = Array ('A', 'A2', 'A22', 'A221');
访问$cats
的值
不检查$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;
...
}
许多谢谢。为什么不使用递归?像这样:
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确实支持end递归),因此这里有一个循环可以实现相同的目的:
// 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];
}
目前为止还好。否则,您将需要遍历数组并检查深度。为了使它动态,我确信在构造$cats时将键添加到$keys数组中。使用递归也会解决它需要更多的步骤,更多的内存。
jburbage使用递归的建议在原则上是可以的,但是据我所知,PHP不支持结束递归。
问题是关于一个"巨大的"多维数组。
由于"massive"意味着除了总体大小之外还有很大的深度,因此这种解决方案可能会遇到堆栈溢出,因为通常有可能在堆上创建的数据结构达到堆栈无法通过递归处理的深度。
在这种情况下,从性能角度来看,这种方法也是不可取的。
简单地重构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);
}
}