Php 如何使用可变数量的索引动态访问多维数组中的值?
本质上,我有一个这样的多维数组(实际上更广泛,但这是我需要访问的基本框架): 我将动态访问此阵列,在尝试访问$arr[1]或$arr[2]之前,我不知道我将访问哪个阵列。因此,我也不知道在那之前我需要深入多少层。我在寻找一个函数,它可以访问多维数组中不同深度的级别,但我找不到类似的函数。我知道我可以用if或switch语句来实现这一点,但我试图将其简化为:Php 如何使用可变数量的索引动态访问多维数组中的值?,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,本质上,我有一个这样的多维数组(实际上更广泛,但这是我需要访问的基本框架): 我将动态访问此阵列,在尝试访问$arr[1]或$arr[2]之前,我不知道我将访问哪个阵列。因此,我也不知道在那之前我需要深入多少层。我在寻找一个函数,它可以访问多维数组中不同深度的级别,但我找不到类似的函数。我知道我可以用if或switch语句来实现这一点,但我试图将其简化为: if ( isset( $arr[$var]...... ) ) { return $arr[$var]......; } 我的问
if ( isset( $arr[$var]...... ) ) {
return $arr[$var]......;
}
我的问题是,我不知道如何构建一个字符串来用适当数量的索引替换“…”。我尝试使用循环创建字符串:
function getAccessString( array $arrOfIndices ) {
$str = '';
foreach( $arrOfIndices as $index ) {
$str .= '['.$index.']';
}
return $str;
}
然而,我无法让这个字符串生成函数的任何变体工作,因为我可以以一种可以访问多维数组的方式连接它
请注意,如果无法以一种非常简单的格式访问此阵列,请按照以下方式
if ( isset( $arr[$var]...... ) ) {
return $arr[$var]......;
}
。。。我将简单地使用switch语句。使用迭代器,解析数组等等不会比我已经得到的switch语句更简单。您可能需要考虑使用PHP的递归迭代器展平数组-
function getArrayElement($arr, $arrayOfIndices) {
$result = $arr;
foreach ($arrayOfIndices as $index) {
$result = $result[$index];
}
return $result;
}
$arr = [
1 => [
'val1' => 'foo',
'val2' => 'bar',
],
2 => [
'type1' => [
'val3' => 'baz',
'val4' => 'fuz',
],
],
];
echo getArrayElement($arr, [1, 'val1']); // echoes foo
echo getArrayElement($arr, [2, 'type1', 'val4']); // echoes fuz
function findValue($needle, $haystack) {
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($haystack));
foreach($iterator as $key=>$value){
if($key == $needle) {
return $value;
}
}
}
$result = findValue('val3', $arr);
echo $result; // returns 'baz'
此设置假定阵列中没有任何重复的键 看看这个:如果在不同的子数组中有重复的键怎么办?它并不适合@Barmar的每种情况,但是通过一点重构它就可以工作了。例如,您可以将返回的值推送到一个数组中,或者您可以以不同的方式指定指针。如果数组很大,这样做似乎也是一种昂贵的方法。每个查找都会变成一个顺序搜索,而不是数组索引。我们正在做一些像这样的大型数组,费用并没有那么高,但我没有将它们与您所做的事情进行对比。我不知道这如何帮助我在一个简单的函数中访问多维数组……啊,是的,我认为这确实是我所需要的。我试试看!谢谢
function findValue($needle, $haystack) {
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($haystack));
foreach($iterator as $key=>$value){
if($key == $needle) {
return $value;
}
}
}
$result = findValue('val3', $arr);
echo $result; // returns 'baz'