2009-09-07 12 views
19

PHPでJSONデータを読み込んでいて、そのデータに空のオブジェクト({}など)が含まれています。だから問題は、私はオブジェクトが異なる方法で空であるケースを処理する必要がありますが、私はチェックを行うための十分な方法を見つけることができません。 empty(get_object_vars(object))はあまりにも恐ろしくて非常に非効率的です。小切手をする良い方法はありますか?JSONオブジェクトがPHPで空であるかどうかをチェックする方法は?

+0

関連:https://stackoverflow.com/q/9412126/3995261 – YakovL

答えて

22

どのように多くのオブジェクトempty(get_object_vars($object))または配列へのキャストが大きな減速/ボトルネックとならない限り、私はそれについて心配しません.Gregの解決策はまあまあです。

でも、私は、JSONデータを復号化する際$associativeフラグを使用することをお勧めしたい:

json_decode($data, true) 

これは、昔ながらのPHP配列としての代わりに、stdClassオブジェクトとしてJSONオブジェクトをデコードします。次に、empty()を使用して空のオブジェクトを確認し、stdClassの代わりにユーザー定義のクラスのオブジェクトを作成することができます。これはおそらく長期的には良い考えです。

24

あなたは(残念ながらあなたがempty()への呼び出し中にこれを行うことはできません配列にキャストできます。

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

または配列とcount()にキャスト:

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

get_object_varsと同じではありませんか?私。本当に効率的ではない? :) – vava

+2

私はそれをテストしていませんが、パフォーマンス上の問題があり、これをボトルネックと認識していない限り、私はそれを自分自身で心配する価値はないと思います。 – Greg

+1

あなたが人生の大半をC++プログラマとして使用していた場合、不要な配列変換を心配するのは簡単ではありません:)ビットが設定されているかどうかを確認するだけのメモリー割り当てとコピーが必要です。 – vava

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()を使用せずに試してみてください。PHP docsオン

get_object_vars($obj) ? TRUE : FALSE; 

我々はノートを読むことができます:

アクセスできないオブジェクトのプロパティにempty()を使用する場合は、__isset()オーバーロードメソッドが呼び出されます、宣言されている場合。 __get()方法を持っているオブジェクト上empty()を使用した場合、それは常にtrueを返します意味

関連する問題