2012-02-07 8 views
10

私は多次元配列を持っている:多次元配列をPHPのオブジェクトに変換する方法は?

$image_path = array('sm'=>$sm,'lg'=>$lg,'secondary'=>$sec_image); 

魔女は次のようになります。

[_media_path:protected] => Array 
      (
       [main_thumb] => http://example.com/e4150.jpg 
       [main_large] => http://example.com/e4150.jpg 
       [secondary] => Array 
        (
         [0] => http://example.com/e4150.jpg 
         [1] => http://example.com/e4150.jpg 
         [2] => http://example.com/e9243.jpg 
         [3] => http://example.com/e9244.jpg 
        ) 

      ) 

と私はオブジェクトに変換し、キーの名前を保持したいと思います。

アイデア?

おかげ

編集:$obj = (object)$image_path;が動作するようには思えません。私は、オブジェクトを配列をループして作成するためのさまざまな方法が必要です

+0

あなたはオブジェクトをどのように見せたいかの良い例を教えてください。キーをプロパティに変換しますか?どのような目的のためにオブジェクトが必要ですか? – mpen

+0

の代わりに '[]'を使って値を取得する必要があります。 ' - >' – Patrioticcow

答えて

71

これを行うための簡単な方法は次のとおりです。に全体の多次元配列に変換します

$obj = json_decode(json_encode($array)); 

説明

json_encode($array) JSON文字列(php.net/json_encode

json_decode($string)は、stdClassオブジェクトにJSON文字列を変換します。第2引数としてをjson_decodeに渡すと、連想配列が返されます。 (php.net/json_decode

ここでのパフォーマンスと再帰的な配列の比較、すべての変換は非常に目立つと思いますが、私はこのベンチマークをいくつか見たいと思います。それは動作し、それは離れて行くつもりはありません。 json_decode(json_encode($a))を使用して@CharlieSから供給されたアプローチ、だろう

$a = (object) array(...); $a->prop = $value; //and so on 

しかし、最も簡単な方法:あなたが能力を持っている場合

+2

OPはトップレベルの配列ではなく、多次元配列全体を必要とするため、これが答えです。 – AeroCross

+1

これはやっかいな方法です。パフォーマンスが懸念される場合、私はこの解決策を避けます。 –

+0

@CalebTaylor - 私は聞いています。私はベンチマークについてはわかりませんが、多次元配列を再帰的に反復することとオブジェクトに追加すること(つまり、この全体を手作業で行うこと)と上記のJSONトリックを単純に実行することの間には、 。 –

6

最良の方法は、最初からオブジェクトとしてデータ構造を管理することです。

同様に、再帰関数を使用して配列を実行することもできます。私はjsonのアプローチに対してこれをベンチマークしていませんが、

function convert_array_to_obj_recursive($a) { 
    if (is_array($a)) { 
     foreach($a as $k => $v) { 
      if (is_integer($k)) { 
       // only need this if you want to keep the array indexes separate 
       // from the object notation: eg. $o->{1} 
       $a['index'][$k] = convert_array_to_obj_recursive($v); 
      } 
      else { 
       $a[$k] = convert_array_to_obj_recursive($v); 
      } 
     } 

     return (object) $a; 
    } 

    // else maintain the type of $a 
    return $a; 
} 

希望するものがあります。

EDIT:json_encode + json_decodeは、必要に応じてオブジェクトを作成します。しかし、配列が数値または混合インデックス(例:array('a', 'b', 'foo'=>'bar'))であった場合、オブジェクト表記(例:$ o-> 1または$ o [1])で数値インデックスを参照することはできません。上記の関数はすべての数値インデックスを 'index'プロパティに置きます。これは数値配列です。したがって、あなたは$o->index[1]を行うことができます。これにより、変換された配列と作成されたオブジェクトとの区別が保持され、数値プロパティを持つオブジェクトをマージするオプションが残されます。

+0

再帰関数を提供していただきありがとうございます。私はおそらく、この問題を抱えている多くの人々に役立つと思います。 json_encode/decodeのパフォーマンスを比較する方法については、PHPのソースコードを確認します。私は興味がある。 –

+1

オブジェクトの数値プロパティは '$ o - > {1}'で参照できます。 –

関連する問題