【问题标题】:How do I access values in a multidimensional array dynamically with a variable number of indices?如何使用可变数量的索引动态访问多维数组中的值?
【发布时间】:2014-09-10 20:33:51
【问题描述】:

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

$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;
}

但是,我无法让该字符串生成函数的任何变体工作,因为我可以以一种可以访问我的多维数组的方式连接它。

附:如果没有办法以非常简单的格式访问这个数组,沿着这条线......

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

... 我将简单地使用 switch 语句。使用迭代器、解析数组和诸如此类的东西不会比我已经得到的 switch 语句更简单。

【问题讨论】:

标签: php arrays multidimensional-array


【解决方案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

【讨论】:

  • 我不明白这如何帮助我在一个简单的函数中访问多维数组...
  • 啊,是的,我认为这确实是我需要的。我会试试的!谢谢。
【解决方案2】:

您可能需要考虑使用 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'

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

【讨论】:

  • 如果不同子数组中有重复键怎么办?
  • 它并不适合@Barmar 的所有情况,但只要稍作重构,它就可以工作。例如,您可以将返回的值推送到数组中,或者您可以以不同的方式指定针头。
  • 如果阵列很大,这似乎也是一种昂贵的方法。每次查找都变成了顺序搜索,而不是数组索引。
  • 我们正在做一些像这样的大型阵列,费用不是那么高,但我没有将它们与您所做的事情进行比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多