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
相关产品推荐
相关产品推荐

