2010-12-04 4 views
14

ORMから引き出されたオブジェクトの配列のjson_encode()を返しています。これには、ヌル値を持つ多くのプロパティが含まれます。ヌルであるこれらのプロパティを削除する最もきれいな方法は何ですか?私はプロパティを反復することができたと思います。それらがnullであるかどうかを調べ、そのプロパティを解除します(しかし、確かによりエレガントな方法が必要です)。nullのオブジェクトのプロパティを削除するPHP関数はありますか?

答えて

27

これを試してください。それは単純なオブジェクト上でしか動作しませんが、ORMから来ているならば、それは十分単純でなければなりません。

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

おかげで私のアイデアを与えるため、昨日別の質問への答えGordon'sへ。

これは、オブジェクトのプロパティキーである連想配列、にオブジェクトを変換

  • によって動作し、それらの値は、アレイが(偽の配列エントリを削除するために、デフォルト引数でarray_filterを用い
  • 値であります例えば、空、またはnull)は、単純なオブジェクトに戻って、これはすべての小道具を削除することを

注意を新しい配列に変換

  • 値空の文字列、偽のブール値と0を含む空の値を持つerties(nullだけでなく)。それらを保持したい場合はarray_filter呼び出しを、まったくnullのリモート呼び出しのみを変更することができます。

    // 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 
    ) 
    
  • +2

    すごいです!これは完全に機能しました。どうもありがとうございます。私はそれがどうやっているのかは分かりませんが、それはとても素敵なトリックです。 – Darren

    +0

    私はそれにも説明を追加します:) –

    +0

    2つの注意点とともに説明を追加しました。 ''と0のような値を持つプロパティも失われます.Array_filter引数は、それら。 –

    2

    null値のプロパティを削除する標準機能はありません。あなたがエレガントに書いていれば、あなた自身のものを書くことは、エレガントではありません。

    1

    1次元のオブジェクトまたは配列を持つ場合にのみ機能します。入れ子になっている配列やオブジェクトがある場合は、受け入れられた解を動作させるために、何らかの再帰的な配列フィルタを作成する必要があります。良くない。

    私の同僚と私が思いついた最善の解決策は、実際にサーバーから返される前にJSON文字列で正規表現を実行することでした。

    $json = json_encode($complexObject); 
    echo preg_replace('/,\s*"[^"]+":null|"[^"]+":null,?/', '', $json); 
    

    正規表現は、先頭のコンマとキーの開始との間に空白を含む形式,"key":nullの文字列内のすべての場所を削除します。また、 "key":nullと一致して、JSONオブジェクトの先頭にヌル値が見つからないことを確認します。

    これは明らかに最も理想的な状況ではありませんが、何らかの種類の再帰的配列フィルタを開発することなくヌルエントリを効果的に削除します。

    +0

    ネストされたオブジェクトがある場合、これはどのように再帰的になりますか? – Kwadz

    +0

    @Kwadz array_walk_recursive – Gordon

    +0

    この質問にお答えできますか? http://stackoverflow.com/questions/41124651/how-to-ignore-null-property-with-jsonserializablejsonserialize – Kwadz

    7

    私はその意志ので、エル・ヨボによって与えられた応答に追加するつもりです:あなたも閉鎖してarray_walkを使用することができます名前にもかかわらず

    // Strips only null values 
    $object = (object) array_filter((array) $object, function ($val) { 
        return !is_null($val); 
    }); 
    
    0

    @Gordonの回答を除いて、その作業を行うには2つの調整が必要ですが、代わりにarray_walk_recursiveを使用することもできます。参照が必要です。そうしないと、オブジェクトに加えた変更は、クロージャー外のスコープには適用されません。

    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); 
    
    関連する問題