在php开发中,经常需要把二维数组转换成一维数组。有些开发者会用eval去动态拼接并执行代码,这种做法虽然能很快出结果,但会带来明显的安全风险。下面我们具体看为什么不建议用eval,以及应该怎么安全地实现转换。

为什么用eval不安全
eval函数会把传入的字符串当作php代码直接执行。如果字符串里包含了外部输入,比如表单数据或接口参数,攻击者就可以构造特殊内容注入任意代码。下面是个简单示例,展示eval可能带来的问题:
<?php
$user_input = $_GET['code']; // 假设攻击者传入 system('rm -rf /')
$arr = array(array(1, 2), array(3, 4));
// 危险示例:把用户输入拼进eval
eval('$result = array_merge(...$arr); ' . $user_input);
?>
上面代码中,攻击者通过code参数就能执行额外命令。所以生产环境应禁止使用eval处理含变量的逻辑。
替代eval的安全方法
方法一:使用array_reduce
用array_reduce可以不断把子数组合并到结果里,全程不使用eval。
<?php
$two_d = array(array(1, 2), array(3, 4), array(5));
$one_d = array_reduce($two_d, function($carry, $item) {
return array_merge($carry, $item);
}, array());
print_r($one_d); // 输出 Array ( [0]=>1 [1]=>2 [2]=>3 [3]=>4 [4]=>5 )
?>
方法二:foreach遍历合并
最直观的方法是foreach循环,把每个子数组的元素加到新数组中。
<?php
$two_d = array(array('a', 'b'), array('c'), array('d', 'e'));
$one_d = array();
foreach ($two_d as $sub) {
foreach ($sub as $val) {
$one_d[] = $val;
}
}
print_r($one_d);
?>
方法三:array_merge加展开运算符
php 5.6以上支持展开运算符,可以一行完成合并,也不必用eval。
<?php $two_d = array(array(10, 20), array(30), array(40, 50)); $one_d = array_merge(...$two_d); print_r($one_d); ?>
方法四:处理不规则多维结构
如果二维数组中还可能嵌套更深,可以用array_walk_recursive提取所有值。
<?php
$two_d = array(array(1, array(2)), array(3, 4));
$one_d = array();
array_walk_recursive($two_d, function($v) use (&$one_d) {
$one_d[] = $v;
});
print_r($one_d);
?>
总结
php二维转一维用eval并不安全,容易引发代码注入。实际开发中,优先使用array_merge配合展开运算符、array_reduce或foreach等原生写法,既清晰又安全。只有在完全可控且无外部输入的调试场景,才可考虑eval,但正规项目应彻底避免。