PHP多维数组扁平化拼接:如何去除多余数字键?
PHP嵌套数组扁平化去除多余数字键的解决方案
要解决扁平化后出现多余数字键的问题,核心是只收集数组的叶子节点值,不保留原嵌套数组的任何键,以下是两种可靠的实现方式:
方法一:递归遍历收集值
通过递归遍历数组,遇到非数组元素时直接追加到结果数组(用[]自动生成连续索引),遇到子数组则递归处理后合并结果:
function flattenArray($array) { $result = []; foreach ($array as $value) { if (is_array($value)) { // 合并递归返回的扁平化数组,array_merge会重新索引数字键 $result = array_merge($result, flattenArray($value)); } else { // 直接追加值,自动生成连续索引 $result[] = $value; } } return $result; }
方法二:使用内置函数array_walk_recursive
PHP内置的array_walk_recursive会自动遍历所有嵌套的叶子节点(非数组元素),我们只需在回调中收集这些值即可:
function flattenArray($array) { $result = []; array_walk_recursive($array, function($item) use (&$result) { $result[] = $item; }); return $result; }
问题原因说明
你之前的函数出现多余数字键,通常是因为:
- 使用了
$result[$key] = $value这类保留原键的赋值方式,导致结果数组保留了原嵌套数组的数字索引 - 用
+=运算符合并数组(它会保留左侧数组的键,右侧同数字键的元素会被忽略) - 递归合并时未使用
array_merge重新索引,导致结果数组的数字键不连续
示例验证
假设输入嵌套数组:
$input = [ 'apple', ['banana', 'cherry', ['date', 'elderberry']], 'fig', ['grape'] ];
调用上述函数后,输出结果为纯值的连续索引数组:
['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig', 'grape']
内容的提问来源于stack exchange,提问作者jijihbt
相关产品推荐
相关产品推荐

