我正在返回从ORM中提取的对象数组的json_encode()。它包含许多具有空值的属性。删除这些null属性的最佳方法是什么?我想我可以迭代属性,看看它们是否为null然后取消设置()该属性,但肯定必须有更优雅的方式?
答案 0 :(得分:34)
试试这个;它只适用于一个简单的对象,但如果它来自一个ORM,它应该足够简单。
// Strips any false-y values
$object = (object) array_filter((array) $object);
感谢昨天回答另一个问题的Gordon's给了我这个想法。
这适用于
请注意,这将删除所有具有空值的属性,包括空字符串,false布尔值和0,而不仅仅是空值;你可以改变array_filter调用,如果你想保留那些,只能远程那些完全为空的那些。
// Strips only null values
$object = (object) array_filter((array) $object, function ($val) {
return !is_null($val);
});
答案 1 :(得分:9)
我要添加El Yobo给出的响应,因为只有拥有1维对象或数组才会有效。如果有任何数组或对象嵌套,那么为了使接受的解决方案起作用,您必须创建某种递归数组过滤器。不好。
我的同事和我提出的最佳解决方案是在从服务器返回JSON字符串之前实际执行正则表达式。
$json = json_encode($complexObject);
echo preg_replace('/,\s*"[^"]+":null|"[^"]+":null,?/', '', $json);
正则表达式将删除表单,"key":null
的字符串中的所有位置,包括前导逗号和键的开头之间的任何空格。它还将匹配" key":null,之后确保在JSON对象的开头没有找到空值。
这显然不是最理想的情况,但它会有效地删除空条目,而不必开发某种递归数组滤波器。
答案 2 :(得分:2)
尽管有这个名字,你也可以使用array_walk
来封闭:
// Setup
$obj = (object) array('foo' => NULL, 'bar' => 'baz');
// equivalent to array_filter
array_walk($obj, function($v,$k) use ($obj) {
if(empty($v)) unset($obj->$k);
});
// output
print_r($obj);
输出
stdClass Object
(
[foo] => bar
)
答案 3 :(得分:1)
没有用于删除空值属性的标准函数。如果你优雅地写一个,那么写你自己的一个并不是不优雅的。
答案 4 :(得分:0)
根据@Gordon的答案,需要进行一些调整才能完成这项工作,但您也可以使用array_walk_recursive。引用是必需的,否则您对该对象所做的任何更改都不会适用于Closure之外的范围。
IE:
$someObject = (array)$someObject;
array_walk_recursive($someObject, function($v,$k) use (&$someObject) {
if($someObject[$k] == null) {
unset($someObject[$k]);
}
});
$someObject = (object)$someObject;
var_dump($someObject);
答案 5 :(得分:0)
我做了这个函数来解决我的问题:清除对象内部的空“对象属性”和“数组属性”。另外,您可以在一个对象内部具有许多“级别”的对象/数组:
function cleanNullsOfObject(&$object) {
foreach ($object as $property => &$value) {
if (is_object($value)) {
cleanNullsOfObject($value);
if (empty(get_object_vars($value))) {
unset($object->$property);
}
}
if (is_array($value) && is_object($value[0])) {
foreach ($value as $val) {
cleanNullsOfObject($val);
}
}
if (is_null($value) || (is_array($value) && empty($value))) {
unset($object->$property);
}
}
}
//test
$object = new stdClass();
$object->property = "qwe";
$object->nullProperty = null;
$propertyObject = new stdClass();
$propertyObject->property = "asd";
$propertyObject->nullProperty = null;
$object->propertyObject = $propertyObject;
var_dump($object);
echo "<br>";
echo "<br>";
cleanNullsOfObject($object);
var_dump($object);