如何在PHP对象定义中添加if判断过滤NULL值字段
解决PHP生成JSON时过滤null字段的方案
首先明确:PHP不支持在对象/数组初始化的表达式内部直接写if分支语句,你可以通过以下两种方式实现需求,同时要注意strval(null)会得到空字符串"",如果要识别原始的NULL值,需要对未转字符串前的原始变量做判断。
方案1:分步构建数组,条件追加字段
这种方式可读性最高,嵌套层级多也容易维护:
<?php $id_info = ($db->query("SomeSQL query")->fetch_assoc())['id']; $name_info = ....; //some more queries // 初始化根数组 $root_arr = []; // 仅当id_info不为null时添加对应字段 if ($id_info !== null) { $root_arr['id'] = strval($id_info); } // 处理Name嵌套字段 $name_arr = []; if ($name_info !== null) { $name_arr['eng_name'] = strval($name_info); } // 仅当Name下有有效字段时才添加Name字段 if (!empty($name_arr)) { $root_arr['Name'] = (object)$name_arr; } // 最终转成对象输出 $obj = (object)$root_arr; echo json_encode($obj); ?>
方案2:使用array_filter过滤null值
如果想写得更精简,可以配合三元运算符和array_filter直接在定义时处理,PHP7.4+支持箭头函数写法:
<?php $id_info = ($db->query("SomeSQL query")->fetch_assoc())['id']; $name_info = ....; //some more queries $obj = (object) array_filter( [ 'id' => $id_info !== null ? strval($id_info) : null, 'Name' => $name_info !== null ? (object)[ 'eng_name' => strval($name_info) ] : null ], fn($value) => $value !== null // 仅保留非null的字段 ); echo json_encode($obj); ?>
如果是PHP7.4以下版本,把箭头函数替换为普通匿名函数即可:
function($value) { return $value !== null; }
自定义调整说明
如果你需要同时过滤空字符串、0等空值,只需要把判断条件从$value !== null改为!empty($value)即可,可根据你的业务需求灵活调整过滤规则。
内容的提问来源于stack exchange,提问作者kdh13
相关产品推荐
相关产品推荐

