我正在用PHP读取JSON数据,该数据包含空对象(如{}
)。所以问题是,我必须以不同的方式处理对象为空的情况,但我找不到足够好的方法来进行检查。empty(get_object_vars(object))
看起来太可怕了,而且效率很低。有没有好的结账方式?
发布于 2009-09-07 14:07:11
你要反序列化多少个对象?除非empty(get_object_vars($object))
或强制转换到数组被证明是一个主要的减速/瓶颈,否则我不会担心它--Greg的解决方案很好。
不过,我建议在解码$associative
数据时使用JSON标志:
json_decode($data, true)
这会将JSON对象解码为普通的老PHP数组,而不是stdClass
对象。然后,您可以使用empty()
检查空对象,并创建用户定义类的对象,而不是使用stdClass
,从长远来看,这可能是一个好主意。
发布于 2009-09-07 13:37:24
您可以将其转换为数组(遗憾的是,您不能在对empty()
的调用中执行此操作
$x = (array)$obj;
if (empty($x))
...
或强制转换为数组和count()
if (count((array)$obj))
...
发布于 2011-07-27 21:06:34
我必须判断一个对象是否为空,但我也必须忽略私有和受保护的属性,所以我做了这个小函数,你可以用它来做这件事。
function empty_obj(&$object, $ignore_private = true, $ignore_protected = true) {
$obj_name = get_class($object);
$obj = (array)$object;
foreach(array_keys($obj) as $prop) {
$is_private = $is_protected = false;
$prop = preg_replace("/[^\w*]/", '', $prop);
$prop_name = str_replace(array($obj_name, '*'), '', $prop);
if(preg_match("~^$obj_name$prop_name$~", $prop))
$is_private = true;
if(preg_match("~^\*$prop_name$~", $prop))
$is_protected = true;
if(!$is_private || !$is_protected || ($is_private && !$ignore_private) || ($is_protected && !$ignore_protected))
return;
}
return true;
}
https://stackoverflow.com/questions/1389431
复制相似问题