php 8.2 中可用纯递归函数 flattenarray 实现多维数组扁平化,支持自定义分隔符、深度限制及类型安全声明,返回键为路径字符串、值不变的一维数组。

PHP 8.2 中将多维数组递归扁平化为一维数组,并用分隔符(如点号 . 或下划线 _)连接嵌套键名,核心在于深度优先遍历 + 键路径累积。不需要依赖外部扩展,纯函数式递归即可高效完成。
递归遍历时累积键路径
每次进入子数组,把当前层级的键追加到已有路径后,用指定分隔符连接。遇到非数组值时,将完整路径作为新键,存入结果数组。
- 初始路径为空字符串,首层键直接作为路径起点
- 递归调用时传入更新后的路径,例如
$newPath = $prefix ? $prefix . '.' . $key : $key - 避免在根键前多出分隔符(如
.user.name),需判断前缀是否为空
兼容 PHP 8.2 的类型安全写法
PHP 8.2 支持只读类、枚举和更严格的类型推导,扁平化函数可声明明确返回类型和参数类型,提升可维护性:
- 参数类型声明为
array $array,不接受null或对象 - 返回类型标注为
array<string mixed></string>,表示键为字符串、值任意 - 使用
is_array()显式判断,不依赖隐式转换(PHP 8.2 对类型更严格)
支持自定义分隔符与递归深度控制
实际项目中可能需适配不同格式(如 JSON 路径用点,配置系统用冒号),或防止超深嵌套导致栈溢出:
- 将分隔符设为可选参数,默认为
. - 加入
$maxDepth参数,每递归一层减 1,≤ 0 时停止深入(仅保留当前层数组原样) - 对键名做基础处理:如用
str_replace([' ', '-'], '_', $key)统一命名风格(按需)
示例实现(简洁可用版)
以下函数已在 PHP 8.2 环境验证,支持空键、数字键、混合键名:
function flattenArray(array $array, string $separator = '.', string $prefix = '', int $maxDepth = -1): array
{
$result = [];
foreach ($array as $key => $value) {
$newPrefix = $prefix === '' ? (string)$key : $prefix . $separator . $key;
if (is_array($value) && ($maxDepth 0)) {
$sub = flattenArray($value, $separator, $newPrefix, $maxDepth > 0 ? $maxDepth - 1 : -1);
$result += $sub;
} else {
$result[$newPrefix] = $value;
}
}
return $result;
}调用:flattenArray(['user' => ['name' => 'Tom', 'profile' => ['age' => 25]]]) → ['user.name' => 'Tom', 'user.profile.age' => 25]
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











