任何PHP函数会剥离一个null的对象的属性?

时间:2010-12-04 06:04:25

标签: php oop json

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

6 个答案:

答案 0 :(得分:34)

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

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

感谢昨天回答另一个问题的Gordon's给了我这个想法。

这适用于

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

请注意,这将删除所有具有空值的属性,包括空字符串,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);