2009-09-07 98 views
19

我正在用PHP讀取JSON數據,該數據包含空對象(如{})。所以問題是,我必須以不同的方式處理對象爲空的情況,但是我找不到足夠的方法來執行檢查。 empty(get_object_vars(object))看起來太可怕了,效率很低。有沒有好的方法來做檢查?如何檢查PHP中的JSON對象是否爲空?

+0

相關:https://stackoverflow.com/q/9412126/3995261 – YakovL 2018-01-03 16:31:53

回答

22

有多少東西你是否正在反序列化?除非empty(get_object_vars($object))或陣列被證明是一個主要的放緩/瓶頸,我不會擔心它 - Greg的解決方案很好。

我建議JSON數據進行解碼時使用的$associative標誌,但:

json_decode($data, true) 

這解碼JSON對象作爲普通舊PHP數組而不是作爲stdClass對象。然後,您可以使用empty()檢查空對象,並創建用戶定義的類的對象,而不是使用stdClass,這從長遠來看可能是一個好主意。

24

你可以將它轉換爲一個數組(不幸的是你不能在一個呼叫中這樣做是爲了empty()

$x = (array)$obj; 
if (empty($x)) 
    ... 

或澆鑄到一個數組和count()

if (count((array)$obj)) 
    ... 
+0

是不是跟get_object_vars一樣?即效率不高? :) – vava 2009-09-07 13:46:05

+2

我沒有測試過它,但除非你有性能問題,並認定這是瓶頸,我不認爲這值得擔心。 – Greg 2009-09-07 14:43:18

+1

如果你是C++程序員的大部分生命,那麼不要停止擔心不必要的數組轉換:)它意味着內存分配和複製東西,只需要快速檢查是否設置了一點。 – vava 2009-09-07 14:57:35

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; 
} 
0

我不確定這是否比鑄造陣列更有效或更不有效,但我會猜測更多。只要你找到答案並停止循環,你就可以開始循環對象。

function is_obj_empty($obj){ 
    if(is_null($obj)){ 
     return true; 
    } 
    foreach($obj as $key => $val){ 
     return false; 
    } 
    return true; 
} 
3

嘗試不使用empty()是:

get_object_vars($obj) ? TRUE : FALSE; 

PHP docs我們可以讀取注:

在使用上不可訪問的對象屬性empty(),該__isset()重載方法將被調用,如果宣佈。

這意味着當在具有__get()方法的對象上使用empty()時,它總是返回True。