我正在使用PHP读取JSON数据,并且该数据包含空对象(如{}
)。所以问题是,我必须以不同的方式处理对象为空的情况,但我找不到足够好的方法来进行检查。 empty(get_object_vars(object))
看起来太可怕而且非常低效。有没有好办法进行检查?
答案 0 :(得分:25)
您可以将其转换为数组(遗憾的是,您无法在调用empty()
时执行此操作:
$x = (array)$obj;
if (empty($x))
...
或转换为数组count()
:
if (count((array)$obj))
...
答案 1 :(得分:23)
您要反序列化多少个对象?除非empty(get_object_vars($object))
或者数组投射被证明是一个主要的减速/瓶颈,否则我不会担心--Greg的解决方案很好。
我建议在解码JSON数据时使用$associative
标志,但是:
json_decode($data, true)
这将JSON对象解码为普通的旧PHP数组,而不是stdClass
个对象。然后,您可以使用empty()
检查空对象,并创建用户定义类的对象,而不是使用stdClass
,这从长远来看可能是一个好主意。
答案 2 :(得分:3)
尝试不使用empty()
,即:
get_object_vars($obj) ? TRUE : FALSE;
在PHP docs,我们可以阅读说明:
在无法访问的对象属性上使用
empty()
时,如果声明了__isset()
重载方法,则会调用它。
这意味着当对具有empty()
方法的对象使用__get()
时,它将始终返回True。
答案 3 :(得分:0)
我必须判断对象是否为空,但我还必须忽略私有属性和受保护属性,因此我使用了这个小函数来完成此任务。
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;
}
答案 4 :(得分:0)
我不确定这是否比投射到阵列更有效或更有效但我想更多。您可以开始循环对象,一旦找到答案并停止循环,就会立即开始循环。
function is_obj_empty($obj){
if( is_null($obj) ){
return true;
}
foreach( $obj as $key => $val ){
return false;
}
return true;
}