
本文介绍使用 laravel 的 arr::dot 辅助函数配合集合操作,将任意深度的嵌套关联数组自动转换为表示层级路径的字符串数组(如 'company.contacts.phones'),支持去重与灵活截断。
本文介绍使用 laravel 的 arr::dot 辅助函数配合集合操作,将任意深度的嵌套关联数组自动转换为表示层级路径的字符串数组(如 'company.contacts.phones'),支持去重与灵活截断。
在开发中,我们常需分析或序列化嵌套数组的结构,例如生成表单字段路径、构建 API 响应元数据、或校验配置项层级。给定一个深度不确定的多维关联数组,目标是提取所有“容器节点”的完整路径(即存在子数组的键路径),而非叶节点(如纯字符串值)。Laravel 提供了高效的内置工具链来优雅解决该问题。
核心思路是:先扁平化,再提取路径,最后去重归一。Arr::dot($array) 会将嵌套数组转为点号分隔的“扁平键名”一维数组,其键即为完整路径(如 'company.contacts.phones.0'),值为对应叶节点内容。随后用 collect()->keys() 获取所有路径键,再通过 Str::beforeLast($key, '.') 截去末尾索引(如 .0 或 .test),即可还原出父级结构路径。
以下是完整可运行示例:
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Illuminate\Support\Collection;
$array = [
'company' => [
'contacts' => [
'first_names',
'last_name',
'emails',
'phones' => [
'test'
]
],
'addresses' => [
'postal_code'
],
]
];
$paths = collect(Arr::dot($array))
->keys()
->map(fn($key) => Str::beforeLast($key, '.'))
->unique()
->values() // 可选:重置索引为连续数字
->all();
print_r($paths);
// 输出:
// Array
// (
// [0] => company.contacts
// [1] => company.contacts.phones
// [2] => company.addresses
// )
⚠️ 注意事项:
- Arr::dot() 会将数值索引(如 ['test'])转为 'key.0' 形式,因此 Str::beforeLast(..., '.') 能精准剥离末位索引,保留结构路径;
- 若需排除仅含数值索引的中间层(如 company.contacts.0 不应出现),本方案天然满足,因 Arr::dot 仅对关联子数组生成多级点号键,纯索引数组会被扁平到底层;
- ->unique() 确保同一路径不重复(如多个 phones 子项共用同一路径);
- 如需兼容非 Laravel 环境,可手动实现 dot 逻辑(递归遍历 + 路径拼接),但推荐优先使用框架原生方法以保证健壮性。
总结:借助 Arr::dot + 集合链式操作,三步即可完成任意深度嵌套数组的结构路径提取——扁平化 → 截路径 → 去重,简洁、高效且易于维护。










