在PHP开发中,多维数组的使用非常普遍,比如从数据库查询得到的嵌套结果、接口返回的层级数据等,很多时候我们需要把这些多层嵌套的数组整理成扁平的一维数组,方便后续做数据遍历、去重或者入库操作。不同的数组结构适合不同的转换方法,下面介绍几种常用的实现方式。

方法一:使用内置函数array_walk_recursive
PHP内置的array_walk_recursive函数可以对数组中的每个元素应用用户自定义函数,并且会递归到更深的数组层级中,非常适合用来处理多维数组转一维的需求。
实现思路是定义一个空的一维数组作为容器,在回调函数中把遍历到的非数组元素依次放入这个容器,最后返回容器数组即可。
<?php
// 定义一个多维数组示例
$multiArray = [
'a' => 1,
'b' => [
'c' => 2,
'd' => [
'e' => 3,
'f' => 4
]
],
'g' => 5
];
$result = [];
// 使用array_walk_recursive遍历多维数组
array_walk_recursive($multiArray, function($value) use (&$result) {
// 将每个非数组的值放入结果数组
$result[] = $value;
});
print_r($result);
// 输出结果:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )
?>
这种方法的优点是代码简洁,不需要自己写递归逻辑,依赖PHP内置函数性能也比较稳定。但是它的局限性是只能提取数组中的值,会丢失原有的键名,而且如果数组中包含空数组,不会影响结果,但如果需要保留特定键名的话就不太适用。
方法二:自定义递归函数实现
如果需要更灵活的控制,比如保留原有的键名、过滤特定类型的值,或者处理特殊结构的多维数组,可以自己编写递归函数来实现转换。
下面的示例实现了保留原键名的多维数组转一维,同时可以过滤掉空值:
<?php
function multiArrayToSingle(array $array, &$result = []) {
foreach ($array as $key => $value) {
// 如果当前值是数组,递归处理
if (is_array($value)) {
multiArrayToSingle($value, $result);
} else {
// 过滤掉空值,保留键名和对应的值
if (!empty($value)) {
$result[$key] = $value;
}
}
}
return $result;
}
// 测试多维数组
$multiArray = [
'id' => 1001,
'info' => [
'name' => '张三',
'age' => 25,
'hobby' => [
'ball' => '篮球',
'music' => '流行'
]
],
'score' => ''
];
$singleArray = [];
multiArrayToSingle($multiArray, $singleArray);
print_r($singleArray);
// 输出结果:Array ( [id] => 1001 [name] => 张三 [age] => 25 [ball] => 篮球 [music] => 流行 )
?>
这种自定义递归的方式灵活性很高,你可以根据需求调整逻辑,比如如果需要把键名拼接起来作为新的一维数组键名,也可以在递归的时候传递当前的键名前缀来实现。
方法三:使用array_merge配合递归
还可以结合array_merge函数和递归来实现转换,这种方式适合需要合并子数组元素的场景。
<?php
function flattenArray(array $array) {
$result = [];
foreach ($array as $value) {
if (is_array($value)) {
// 递归处理子数组,合并结果
$result = array_merge($result, flattenArray($value));
} else {
$result[] = $value;
}
}
return $result;
}
$testArray = [1, [2, 3], [4, [5, 6]]];
$res = flattenArray($testArray);
print_r($res);
// 输出结果:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 )
?>
这种方法的逻辑比较直观,递归遍历每个元素,如果是数组就递归展开后合并,不是数组就直接加入结果。不过要注意array_merge在合并索引数组的时候会重置索引,如果需要保留原有索引的话要谨慎使用。
不同方法的适用场景对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| array_walk_recursive | 代码简洁,无需自定义递归逻辑,性能稳定 | 无法保留键名,灵活性低 | 只需要提取数组所有值,不需要键名的场景 |
| 自定义递归函数 | 灵活性高,可自定义过滤、键名处理规则 | 需要自己编写递归逻辑,代码量稍多 | 需要保留键名、过滤特定值、处理特殊结构的场景 |
| array_merge配合递归 | 逻辑直观,适合合并子数组元素 | 合并索引数组会重置索引,不适合保留原有索引 | 只需要值组成一维数组,不关心索引的场景 |
在实际开发中,你可以根据多维数组的具体结构和转换需求选择合适的方法,如果数组层级不深且需求简单,优先使用内置函数可以减少代码量,如果需要定制化处理,自定义递归函数会是更好的选择。
PHP多维数组转一维数组array_walk_recursive递归array_merge修改时间:2026-06-30 00:33:32