
本文介绍一种简洁、健壮的递归方法,将任意深度的多维关联数组的所有叶子节点键路径(如 aaa_email_main)完整提取为一维字符串数组,支持自定义分隔符,避免全局变量与副作用。
本文介绍一种简洁、健壮的递归方法,将任意深度的多维关联数组的所有叶子节点键路径(如 `aaa_email_main`)完整提取为一维字符串数组,支持自定义分隔符,避免全局变量与副作用。
在 PHP 开发中,常需将配置类多维数组(如 INI 或 YAML 解析后的结构)转换为扁平化的键路径列表,用于动态模板渲染、配置校验或前端映射。例如,将 $ini_config['aaa']['email']['main'] 转为 'aaa_email_main' 形式。关键要求包括:支持 1–4 层嵌套、键均为字符串、不依赖全局变量、结果可直接用于后续逻辑。
推荐使用纯函数式递归方案,核心是 keyPaths() 函数:
function keyPaths(array $array, array $carry = [], string $separator = ''): array {
foreach ($array as $key => $value) {
if (is_array($value)) {
// 递归进入子数组,累积当前键 + 分隔符
$carry = keyPaths($value, $carry, $separator . $key . '_');
} else {
// 到达叶子节点,保存完整路径(不含尾部多余下划线)
$carry[] = $separator . $key;
}
}
return $carry;
}
// 示例数据
$ini_config = [];
$ini_config['aaa']['email']['main'] = '<a class="__cf_email__" data-cfemail="cfa2aa8fa1aea2aae1aca0a2" href="/cdn-cgi/l/email-protection">[email protected]</a>';
$ini_config['bbb']['email']['ccc'] = '<a class="__cf_email__" data-cfemail="fa83958fba949b979fd4999597" href="/cdn-cgi/l/email-protection">[email protected]</a>';
$ini_config['bbb']['phone']['local'] = '800-555-1212';
$ini_config['bbb']['phone']['skype'] = '744-222-1234';
$ini_config['ccc']['phone']['main'] = 'domain.com';
$ini_config['ccc']['domain']['https'] = 'https://www. domain.com';
$ini_config['ccc']['fax'] = '744-222-1237';
// 执行提取
$result = keyPaths($ini_config);
print_r($result);
// 输出:
// Array (
// [0] => aaa_email_main
// [1] => bbb_email_ccc
// [2] => bbb_phone_local
// [3] => bbb_phone_skype
// [4] => ccc_phone_main
// [5] => ccc_domain_https
// [6] => ccc_fax
// )
✅ 优势说明:
- 无副作用:不使用 global 或静态变量,完全函数式,便于单元测试;
- 灵活分隔符:默认 '_',可传入 '.' 或 '->' 适配不同场景(如 $separator = '.' → 'aaa.email.main');
- 类型安全:严格声明 array 参数与返回类型,PHP 7.4+ 可启用严格模式;
- 边界鲁棒:空数组返回空 [],单层数组直接生成键名(如 ['foo' => 'bar'] → ['foo'])。
⚠️ 注意事项:
- 该函数仅提取叶子节点路径(即值非数组的键路径),跳过中间纯容器节点(如 'aaa' 和 'aaa.email' 不单独出现);
- 若需包含所有层级路径(含中间节点),需额外标记或修改逻辑;
- 大型嵌套数组(>10 层)可能触发 PHP 递归限制,生产环境建议添加深度计数保护。
此方案兼顾可读性、可维护性与性能,是处理配置路径提取的标准实践。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











