最常用且最安全的方式是 foreach 遍历时用 $new[] = $item 追加元素,需先初始化 $new = [];,关联键需显式使用 $new[$key] = $value 保留。

用 foreach 遍历时直接 []= 追加是最常用也最安全的方式
PHP 中遍历(比如 foreach)本身不返回新数组,必须显式构造。最直白的做法就是在循环体内用 [] = 语法向空数组追加元素。这种方式语义清晰、兼容所有 PHP 版本(包括 5.6+),且不会意外覆盖键名。
常见错误是试图用 array_push($new, $item) 替代 $new[] = $item——两者效果一致,但前者多一次函数调用开销,且在严格模式下若 $new 未初始化会报 Warning: array_push() expects parameter 1 to be array。
- 务必先初始化目标数组:
$new = [];,否则后续$new[] = ...会触发Notice: Undefined variable - 如果原数组有非数字键(如关联键
'name' => 'Alice'),$new[] = $value会丢弃原键、生成新数字索引;需要保留键请改用$new[$key] = $value - 避免在循环中反复调用
array_merge(),例如$new = array_merge($new, [$item])—— 时间复杂度 O(n²),大数据量时明显变慢
用 array_map() 适合“一对一”转换,且不修改原数组
当你的遍历逻辑是纯函数式映射(比如把每个字符串转大写、每个数字乘以 2),array_map() 是更简洁的选择。它自动创建新数组并返回,不改变输入数组,也天然支持闭包和回调函数。
注意:它只适用于每个输入项产生一个输出项的场景。一旦逻辑涉及条件跳过、合并多个源或需要访问循环索引,就该切回 foreach。
立即学习“PHP免费学习笔记(深入)”;
- 基本用法:
$new = array_map(fn($x) => strtoupper($x), $old);(PHP 7.4+ 箭头函数) - PHP 5.6–7.3 可用匿名函数:
$new = array_map(function($x) { return $x * 2; }, $numbers); - 传入
null作为回调等价于“原样复制”:array_map(null, $arr)和array_values($arr)效果不同——前者保留原始键,后者重置为数字键
用 for 循环存结果时,别忘了预分配数组长度(可选优化)
如果确定新数组长度和原数组一致(比如逐个转换),用 for 循环配合预分配 array_fill(0, count($old), null) 能略微提升性能,尤其在处理数千以上元素时。PHP 的数组是哈希表实现,预填可以减少内部扩容次数。
但多数业务场景下差异微乎其微,过度优化反而增加代码理解成本。除非 foreach 或 array_map() 已被证实为瓶颈,否则不建议优先考虑。
- 预分配写法:
$new = array_fill(0, count($old), null); for ($i = 0; $i - 注意
count($old)在循环条件里重复调用会轻微拖慢,应提前存为变量:$len = count($old); for ($i = 0; $i - 若原数组稀疏(比如键为
[0, 5, 100]),for会遍历空槽位,此时必须用foreach或array_keys()配合
遇到嵌套结构或需过滤时,foreach + 条件判断仍是首选
比如从用户数组中筛选出状态为 'active' 的用户名,或把二维数组中每个子数组的 'id' 提取出来。这类操作涉及判断、跳过、甚至多层访问,array_filter() 和 array_column() 虽能部分替代,但组合使用易读性下降,调试困难。
一个典型陷阱是误用 array_filter() 后忘记重置键——它默认保留原键,导致 foreach 出来的键不是连续数字,后续用 for 循环会出错。
- 推荐写法:
$activeNames = []; foreach ($users as $user) { if ($user['status'] === 'active') { $activeNames[] = $user['name']; } } - 如果之后要 JSON 输出,记得必要时调用
array_values($activeNames)重置键,否则 JavaScript 解析可能得到对象而非数组 -
array_column($users, 'name', 'id')会生成['101' => 'Alice', '102' => 'Bob'],不是简单的数值索引数组,别直接当成“提取列”的万能解
实际项目里,90% 的需求用第一种 foreach + [] = 就够了。真正容易被忽略的是键的处理逻辑——到底是想要数字索引、原键、还是完全自定义的键,这个决定会影响后续所有数组操作,得在第一行赋值前就想清楚。



















