2009-06-30 14 views
7

私は、データベースから行を引っ張る関数を持っています。content-> idとcontent-> typeは、すでに読み込まれたモデルのamethodを動的に呼び出して、オブジェクトの詳細を取得してフォーマットします。オブジェクトが返されると、配列に追加されます。私は配列が正しい数の項目を持っていますが、配列を使うようになると、すべてが同じオブジェクトを含んでいますが、返されることが分かっています。私はこの1つの完全な損失で、どんな助けやアイデアも素晴らしいことができます!PHPで配列にオブジェクトを格納する

​​

としますprint_r文は、この生成します:

コード

は、以下の項目ではなく、アイテムそのものに

stdClass Object 
(
    [id] => 30 
    [type] => page 
) 

stdClass Object 
(
    [id] => 29 
    [type] => page 
) 

Array 
(
    [0] => stdClass Object 
     (
      [id] => 29 
      [type] => page 
     ) 

    [1] => stdClass Object 
     (
      [id] => 29 
      [type] => page 
     ) 

) 
+0

これはコードのコピー貼り付けですか? – cgp

答えて

13

私は問題が修正され、アレイ内のすべての項目で、その結果、あなたはget関数から参照で同じオブジェクトを毎回を取得し、その配列を参照それを追加することであることを推測しますアイテムはget機能で変更されます。その場合は、次のように動作するはずです:

foreach($query->result() as $content) 
{ 
    $item = $this->{'mod_'.$content->type}->get($content->id); 
    print_r($item); 
    $items[] = clone $item; 
} 
print_r($items); 
+0

完璧!これはうまくいきました:$ items [] = clone($ item); –

3

あなたはおそらく戻ってきているの参照を。これは$ itemが指し示す最後の参照です。

4

あなたは$アイテムに$アイテムをプッシュする場合は、値$アイテムポイントにではなく、参照そのものをプッシュしていません。毎回$ itemを初期化する必要があります:

foreach($query->result() as $content) 
{ 
    $item = new stdClass(); 
    $item = $this->{'mod_'.$content->type}->get($content->id); 
    print_r($item); 
    $items[] = $item; 
} 
print_r($items); 
+0

このようなことは問題だと思っていましたが、毎回それを初期化することはできませんでした。しかし、$ items [] = clone($ item)は –

+0

でした。2番目の検査では、なぜこの方法がうまくいかないのかを理解するのは簡単です。 $ itemsは$ itemで埋められた配列ですが、これはまだ参考になっています。 $ itemを再初期化すると、すべてのアイテムが同じオブジェクトを参照し続けることを意味します。上で述べたように、clone()は方法です:) – MoshiBin