
本文介绍使用 laravel 的 arr::dot 辅助函数配合集合操作,将任意深度的嵌套关联数组高效扁平化为唯一的点号路径(如 'company.contacts.phones'),适用于生成字段映射、表单结构解析或 api 响应模板等场景。
本文介绍使用 laravel 的 arr::dot 辅助函数配合集合操作,将任意深度的嵌套关联数组高效扁平化为唯一的点号路径(如 'company.contacts.phones'),适用于生成字段映射、表单结构解析或 api 响应模板等场景。
在开发中,我们常需将嵌套数组的结构“可视化”为层级路径字符串,例如将 ['company' => ['contacts' => ['phones' => ['test']]]] 转换为 ['company.contacts', 'company.contacts.phones'] —— 注意:仅保留存在子数组的中间键路径,忽略纯叶子值(如字符串、数字)所在的末级键。Laravel 提供了简洁高效的解决方案。
核心思路
利用 Arr::dot() 将嵌套数组扁平化为点号键名的一维数组(如 'company.contacts.phones.0' => 'test'),再提取所有键名,对每个键执行 Str::beforeLast($key, '.') 截取最后一级前的路径,最后去重即可获得所有有效父级路径。
完整实现代码
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() 内部递归处理,无需手动编写递归函数;
- ✅ 自动跳过叶子值路径:因 Arr::dot() 仅对数组键生成点号路径,原始值(如 'first_names' 字符串)不会产生新键,故 Str::beforeLast 对形如 'company.contacts.0' 的键截取后得到 'company.contacts',天然满足“只保留有子结构的路径”需求;
- ⚠️ 依赖 Laravel 支持:需确保项目已引入 Illuminate\Support\Arr 和 Illuminate\Support\Str;若在非 Laravel 环境,可单独引入 laravel/helpers Composer 包;
- ? 如需包含最深层空数组路径(如 'company.contacts.phones' 即使其值为空数组 []),当前方案仍适用;但若需排除无子元素的键,请额外过滤 ->filter(fn($path) => !is_numeric(end(explode('.', $path))))(慎用,通常不必要);
- ? 扩展建议:可封装为全局辅助函数,例如 array_keys_dotted($array),提升复用性。
该方法兼具简洁性、可读性与健壮性,是处理动态嵌套结构元信息的理想实践。

















