array_fill()最省事,适合初始化索引数组;已有数组改值用array_map()(数字键)或foreach/array_walk()(保字符串键);复杂条件赋值首选foreach。

直接用 array_fill() 最省事
如果只是想给索引数组填满同一个值(比如全设为 null、0 或空字符串),array_fill() 是最直白的选择。它不依赖原数组结构,纯新建——适合初始化场景。
常见错误是误以为它能“覆盖”已有键:它只按数字索引生成新数组,不会合并或补漏。
-
array_fill(0, 5, 'default')→[0=>'default', 1=>'default', ..., 4=>'default'] - 起始索引可以不是
0,比如array_fill(10, 3, 'x')得到键10、11、12 - 第二个参数必须是非负整数,传负数会警告并返回空数组
已有索引数组,批量改值用 array_map() 或循环
当数组已存在,只想统一修改所有值(比如全部转小写、加前缀、置空),array_map() 更函数式,但注意它不保留键名——对纯数字索引数组没问题;若含字符串键且需保留,得用 foreach。
-
array_map(fn($v) => $v * 2, $arr)→ 值翻倍,键不变(PHP 8.0+ 箭头函数) - 要保留键又不想写循环?用
array_walk():它直接修改原数组,且保持键名,array_walk($arr, fn(&$v) => $v = 'new') - 别用
array_map()去改引用值,它返回新数组,原数组不动
按条件批量赋值,foreach 最可控
真正灵活的批量操作往往带逻辑,比如“偶数索引设为 A,奇数设为 B”,或者“值大于 10 的才改成 -1”。这时候硬套函数反而绕路,foreach 直接明了。
- 用
foreach ($arr as $key => &$value)可以安全修改原值(记得加&引用) - 避免在循环里用
for ($i = 0; $i —— 每次都调用 <code>count()影响性能,应先存结果:$len = count($arr) - 如果需要根据键和值共同判断,
foreach的双变量形式比array_walk()更易读
别踩 array_merge() 的坑
有人想“批量赋值”就拼个新数组再合并,比如 array_merge($arr, array_fill_keys(array_keys($arr), 'new'))。这方法错在:数字索引会被重排,原键名丢失;而且效率低,多一次遍历和内存分配。
-
array_merge()对数字键永远重编号,哪怕你只合并两个全是数字键的数组 - 想按键名覆盖?用
+运算符:$arr = $arr + array_fill_keys(array_keys($arr), 'new'),但它只覆盖不存在的键,已有键不变 - 真要覆盖全部键值,不如直接
foreach赋值,语义清楚,无歧义
实际批量赋值的复杂点不在语法,而在你到底想“替换值”“扩展结构”还是“条件更新”。选函数前先问一句:这个操作要不要保留原键、是否依赖上下文逻辑、会不会被后续代码当成新数组处理。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











