是否有任何PHP函数将剥离空对象的属性?

2022-08-30 16:33:29

我正在返回从ORM中提取的对象数组的json_encode()。它包括许多具有空值的属性。删除这些空属性的最简洁方法是什么?我想我可以迭代属性,看看它们是否为空,然后取消set()该属性,但肯定有一种更优雅的方式吗?


答案 1

试试这个;它只适用于一个简单的对象,但如果它来自ORM,它应该足够简单。

// Strips any false-y values
$object = (object) array_filter((array) $object);

感谢戈登昨天回答了另一个问题,让我有了这个想法。

这的工作原理

  • 将对象转换为关联数组,其中对象属性是键,其值是数组值
  • 使用具有默认参数的array_filter来删除具有假(例如空或空)值的数组条目
  • 将新数组转换回简单对象

请注意,这将删除所有具有空值的属性,包括空字符串,假布尔值和0,而不仅仅是空值;您可以更改array_filter调用,如果你想保留那些并且只保留那些完全为空的远程调用。

// Strips only null values
$object = (object) array_filter((array) $object, function ($val) {
    return !is_null($val);
});

答案 2

我将补充El Yobo给出的响应,因为只有当你有一个1维对象或数组时,这才有效。如果有任何数组或对象嵌套,那么为了让接受的解决方案正常工作,您必须创建某种递归数组过滤器。不好。

我和我的同事想出的最好的解决方案是在从服务器返回JSON字符串之前,对JSON字符串实际执行正则表达式。

$json = json_encode($complexObject);
echo preg_replace('/,\s*"[^"]+":null|"[^"]+":null,?/', '', $json);

正则表达式将删除表单字符串中的所有位置,包括前导逗号和键开头之间的任何空格。它还将匹配“key”:null,然后确保在 JSON 对象的开头未找到 null 值。,"key":null

这显然不是最理想的情况,但它将有效地删除空条目,而不必开发某种递归数组过滤器。


推荐