array_map是最直接安全的遍历转换方式,不修改原数组而返回新数组;但会重置非数字键,需保留键名时应改用foreach。

用 array_map 遍历转换最直接
PHP 没有内置函数能一键把数组里所有空字符串变成 null,得自己遍历处理。array_map 是最常用也最安全的选择,它不修改原数组,返回新数组,适合多数场景。
常见错误是写成 array_map('trim', $arr) 后再判断——这多了一步且容易漏掉嵌套结构。直接在回调里判断更稳:
function emptyToNull($v) {
return $v === '' ? null : $v;
}
$result = array_map('emptyToNull', $arr);
- 必须用
=== '',不能用== '',否则0、false、null也会被误转 - 只处理一级值,深层嵌套(如多维数组)需递归或改用
array_walk_recursive - 如果原数组带非标键(字符串键、负数键),
array_map会重置为数字索引——需要保留键名时,得用foreach
保留键名时用 foreach 更可靠
很多实际数据(比如 POST 表单解析结果)依赖键名,array_map 会丢掉它们。这时候老老实实用 foreach 显式赋值,控制力更强:
$result = [];
foreach ($arr as $k => $v) {
$result[$k] = ($v === '') ? null : $v;
}
-
foreach不改变原数组,但如果你写成&$v引用赋值,就能直接改原数组——注意副作用 - 如果要同时 trim 再判空,写成
trim($v) === '',但得确认业务是否允许去首尾空格 - 遇到
null、0、false这些“falsy 值”,它们不会被转成null,只有纯''才触发
处理多维数组得递归或用 array_walk_recursive
表单提交的嵌套结构(如 user[name]、tags[0][id])展开后是多维数组,array_map 和普通 foreach 都只扫一层。
array_walk_recursive 能进到叶子节点,但它不返回新数组,只能原地改:
array_walk_recursive($arr, function(&$v) {
if ($v === '') $v = null;
});
- 这个函数会修改原数组,且无法保留原始键路径(比如你不知道当前
''是来自哪一层) - 如果需要生成新数组并保留完整结构,必须手写递归函数,判断
is_array($v)再调自己 - 深度很大时注意 PHP 默认递归限制(
xdebug.max_nesting_level),超了会报Fatal error: Maximum function nesting level
JSON 场景下注意 null 和空字符串的序列化差异
很多人转 null 是为了后续 json_encode 输出符合 API 规范。这里有个易忽略点:json_encode 对 null 和空字符串的处理完全不一样:
-
''编码成""(字符串) -
null编码成null(JSON null 字面量) - 如果接收方是 TypeScript 或 Java,
null可能映射为可空引用类型,而""是非空字符串——类型校验会失败 -
json_encode默认跳过值为null的键(除非加JSON_FORCE_OBJECT),但空字符串不会被跳过
所以别只盯着“转没转成 null”,得看下游怎么消费这个 JSON。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











