array_map回调必须显式return,否则结果对应位置为null;多数组时以最长为准、缺位补null;不保留原键名;性能敏感场景慎用。

array_map 的回调函数必须返回值,否则结果数组对应位置是 null
很多人写 array_map 时在回调里只做 echo 或修改全局变量,忘了 return,结果得到一串 null。PHP 不会报错,但数组元素全丢了。
- 回调函数里每一步处理完必须显式
return新值(哪怕是原值) - 如果想跳过某个元素,不能
return null——null仍是有效返回值,会保留在结果数组中;真要过滤得用array_filter - 匿名函数里访问外部变量要用
use,比如function($v) use ($prefix) { return $prefix . $v; }
传入多个数组时,array_map 按索引对齐,缺位补 null,不是按长度截断
当传两个或以上数组进 array_map,它不会自动对齐长度,而是以「最长数组」为基准,短数组对应位置填 null。这和 array_merge 或循环遍历的直觉不同,容易引发空指针类错误。
- 例如
array_map(fn($a, $b) => $a + $b, [1,2], [3])实际调用两次:fn(1,3)和fn(2,null) - 若回调没检查
$b !== null,第二轮就会触发警告:Warning: A non-numeric value encountered - 安全写法是加判断:
fn($a, $b) => $a + ($b ?? 0)
array_map 不修改原数组,也不保证键名保留(尤其关联键)
array_map 总是返回新数组,原数组不变 —— 这点没问题。但很多人误以为「关联数组的键会原样复制」,其实只有数字索引能保持顺序,字符串键会被重置为 0、1、2…
- 输入
['a' => 1, 'b' => 2],输出是[0 => 新值1, 1 => 新值2],键名丢失 - 需要保留键名?改用
foreach手动重建,或封装一层:array_combine(array_keys($arr), array_map($cb, $arr)) - 注意
array_combine要求两数组等长,否则返回false
性能敏感场景慎用 array_map 替代 foreach
单纯遍历+赋值时,array_map 比 foreach 多一次函数调用开销,且强制生成新数组,内存占用翻倍。PHP 8.1+ 虽有优化,但差异仍在。
立即学习“PHP免费学习笔记(深入)”;
- 处理超大数组(如万级元素)且只做简单运算时,
foreach更快更省内存 -
array_map真正优势在于函数式表达清晰、可读性高、天然支持多数组并行处理 - 如果回调是内置函数(如
'intval'),PHP 会走快速路径,性能差距缩小;但自定义匿名函数仍慢于直接循环



















