绝对不安全,eval() 执行字符串代码可能导致远程命令执行;推荐用 array_merge(...$array) 或循环 + array_merge() 安全扁平化二维数组。

用 eval() 解二维数组绝对不安全
直接执行字符串代码,只要数组键名或值里混入恶意片段(比如 system('rm -rf /')),就可能触发远程命令执行。哪怕数据看似“可控”,只要未来有任意一环放开输入(如数据库字段、配置文件、URL 参数),eval() 就是定时炸弹。
array_merge(...$array) 是最简替代方案(PHP 5.6+)
适用于「每个子数组都是索引数组且无需保留键名」的场景。它本质是解包后合并,天然扁平化一层:
$twoD = [[1, 2], [3, 4], [5]]; $oneD = array_merge(...$twoD); // [1, 2, 3, 4, 5]
- 如果子数组含字符串键(如
['a' => 1]),这些键会被丢弃,只留值 - PHP 5.6 以下不支持
...解包,会报Parse error: syntax error - 内存友好,无递归开销,性能接近原生
兼容老版本 PHP 的安全写法:循环 + array_merge()
避开 eval() 和 create_function()(已废弃),也绕过 array_reduce() 的闭包复杂度:
$oneD = [];
foreach ($twoD as $sub) {
$oneD = array_merge($oneD, $sub);
}
- 明确控制流程,调试时每步都可见
- 子数组若为关联数组,
array_merge()会重置数字键、保留字符串键——这点和解包行为一致 - 注意:频繁调用
array_merge()在超大数组下有轻微性能损耗,但远比eval()风险可控
需要保留原始键名?用 foreach 手动压入 + array_values()
当二维结构是 ['group1' => ['id' => 1], 'group2' => ['id' => 2]],且你只想提取所有 id 值,不能靠合并——得遍历取值:
立即学习“PHP免费学习笔记(深入)”;
$ids = [];
foreach ($twoD as $group) {
if (isset($group['id'])) {
$ids[] = $group['id'];
}
}
$ids = array_values($ids); // 确保索引连续
- 这里没有通用函数能一步到位,硬编码访问路径是常态
- 别用
array_column($twoD, 'id')直接解——它只对「一维数组的数组」有效,对嵌套更深或结构不统一的数据会漏值或报错 - 如果结构深度 > 2(如三维),必须明确是否要完全展平,还是仅降一维——这决定了该用递归还是单层循环











