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

时间:2014-09-10 20:33:51

标签: php arrays multidimensional-array

基本上,我有一个像这样的多维数组(它实际上要广泛得多,但这是我需要访问的裸骨架):

$arr = [
    1 => [ 
        'val1' => 'foo',
        'val2' => 'bar',
    ],
    2 => [
        'type1' => [
            'val3' => 'baz',
            'val4' => 'fuz',
        ],
    ],
]

我将动态访问这个数组,并且在我尝试这样做之前不会知道我是否会访问$ 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;
}

然而,我无法获得该字符串制作函数的任何变体,因为我可以以一种访问我的多维数组的方式连接它。

P.S。如果没有办法以非常简单的格式访问这个数组......

if ( isset( $arr[$var]...... ) ) {
    return $arr[$var]......;
}

...我将简单地使用switch语句。使用迭代器,解析数组和其他东西不会比我已经得到的switch语句简单。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可能想要考虑使用PHP的递归迭代器展平数组 -

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'

这是假设您的阵列中没有任何重复键的设置。