You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中如何简洁遍历含混合键的多维数组?

简洁的多维混合数组遍历方案

嘿,我来给你分享一个优雅又通用的解决办法,完美处理这种混合了关联键和数字索引的多维数组遍历需求!

首先先明确你的原数组:

$Call = array(
    "Foo1" => array(
        "Bar1" => array( "Baz1", "Baz2" )
    ),
    "Foo2",
    "Foo3" => array( "Bar2", "Bar3" )
);

核心思路:递归遍历+前缀匹配

因为数组是多层嵌套的,而且存在数字索引(比如Foo2对应的键是0),所以用递归遍历的方式可以轻松处理任意深度的嵌套,同时针对键(关联键)和值(数字索引下的元素)分别做前缀匹配,提取所有Foo/Bar/Baz开头的元素。

实现代码

这里提供两种版本,分别适配不同PHP版本:

PHP 8.0+ 版本(使用str_starts_with更简洁)

function extractTargetElements(array $array): array {
    $result = [];
    
    foreach ($array as $key => $value) {
        // 处理关联键:如果键是Foo/Bar开头,加入结果
        if (is_string($key) && (str_starts_with($key, 'Foo') || str_starts_with($key, 'Bar'))) {
            $result[] = $key;
        }
        
        // 处理值:如果是字符串且是Foo/Bar/Baz开头,加入结果
        if (is_string($value) && (str_starts_with($value, 'Foo') || str_starts_with($value, 'Bar') || str_starts_with($value, 'Baz'))) {
            $result[] = $value;
        }
        
        // 如果值是数组,递归遍历
        if (is_array($value)) {
            $result = array_merge($result, extractTargetElements($value));
        }
    }
    
    return $result;
}

// 调用函数并输出结果
$elements = extractTargetElements($Call);
print_r($elements);

兼容PHP 7.x及更低版本(使用substr判断前缀)

function extractTargetElements(array $array): array {
    $result = [];
    
    foreach ($array as $key => $value) {
        // 处理关联键
        if (is_string($key) && (substr($key, 0, 3) === 'Foo' || substr($key, 0, 3) === 'Bar')) {
            $result[] = $key;
        }
        
        // 处理值
        if (is_string($value)) {
            $prefix = substr($value, 0, 3);
            if (in_array($prefix, ['Foo', 'Bar', 'Baz'])) {
                $result[] = $value;
            }
        }
        
        // 递归处理子数组
        if (is_array($value)) {
            $result = array_merge($result, extractTargetElements($value));
        }
    }
    
    return $result;
}

// 调用示例
$elements = extractTargetElements($Call);
print_r($elements);

输出结果

不管用哪个版本,最终都会输出:

Array
(
    [0] => Foo1
    [1] => Bar1
    [2] => Baz1
    [3] => Baz2
    [4] => Foo2
    [5] => Foo3
    [6] => Bar2
    [7] => Bar3
)

为什么这个方案更优?

  • 简洁通用:递归逻辑自动处理任意深度的嵌套数组,不用手动写多层循环
  • 兼容混合索引:同时处理关联键(比如Foo1、Bar1)和数字索引下的元素(比如Foo2)
  • 可扩展性强:如果以后要增加其他前缀,只需要修改判断条件即可

内容的提问来源于stack exchange,提问作者Atlas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:12:38