Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用可变数量的索引动态访问多维数组中的值?_Php_Arrays_Multidimensional Array - Fatal编程技术网

Php 如何使用可变数量的索引动态访问多维数组中的值?

Php 如何使用可变数量的索引动态访问多维数组中的值?,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,本质上,我有一个这样的多维数组(实际上更广泛,但这是我需要访问的基本框架): 我将动态访问此阵列,在尝试访问$arr[1]或$arr[2]之前,我不知道我将访问哪个阵列。因此,我也不知道在那之前我需要深入多少层。我在寻找一个函数,它可以访问多维数组中不同深度的级别,但我找不到类似的函数。我知道我可以用if或switch语句来实现这一点,但我试图将其简化为: if ( isset( $arr[$var]...... ) ) { return $arr[$var]......; } 我的问

本质上,我有一个这样的多维数组(实际上更广泛,但这是我需要访问的基本框架):

我将动态访问此阵列,在尝试访问$arr[1]或$arr[2]之前,我不知道我将访问哪个阵列。因此,我也不知道在那之前我需要深入多少层。我在寻找一个函数,它可以访问多维数组中不同深度的级别,但我找不到类似的函数。我知道我可以用if或switch语句来实现这一点,但我试图将其简化为:

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'