2009-06-30 17 views
7

Veritabanından satırları çeken bir işleve sahibim, content-> id ve content-> type, nesne ayrıntılarını almak ve biçimlendirmek için zaten yüklü bir modelde amethod'u dinamik olarak çağırmak için kullanılır . Nesne döndükten sonra diziye eklenir. Dizinin doğru sayıda olmasına rağmen diziyi kullanmaya geldiğimde, hepsi farklı bir şekilde döndüklerini bildiğim halde hepsi aynı nesneyi içerirler. Bu biriyle tam bir kaybettim, harika olabilecek her türlü yardım/fikir!Nesnelerin bir dizide php ile depolanması

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

Ve print_r ifadeleri bu üretmek:

kod

altındadır öğe değil, ürün kendilerini

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

Bu, kodunuzun doğru bir kopyası mı? – cgp

cevap

13

Ben sorun get işlevinden referans tarafından aynı nesneye her zaman almak olduğunu tahmin ve sonra ne zaman değiştirilen dizideki tüm öğelerin sonuçlanan diziye atıfta bunu eklersiniz Öğe, get işlevinde değiştirilir. Bu durumda, aşağıdaki çalışması gerekir:

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

Mükemmel! Bu çalıştı: $ items [] = clone ($ item); –

3

Muhtemelen dönüyor referanslar. Her zaman, $ öğesinin gösterdiği son referans olacaktır.

4

sen $ ürün için $ öğeyi itmek, bu değer $ öğesi noktaları için değil, başvuru kendisi itmek değil. Her seferinde $ öğesini başlatmanız gerekecek:

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

Bunun gibi bir şeyin sorun olacağını ama her seferinde işe yaramayacağını düşündüm. $ items [] = klonlama ($ item) –

+0

yaptı İkinci incelemede bu yöntemin neden çalışmadığını anlamak kolay; $ öğeler, hala referans olan $ item ile dolu bir dizidir. $ Öğesini sıfırlamak, tüm öğelerin yine aynı nesneye başvurması anlamına gelir. Yukarıda belirtildiği gibi, clone() yolu :) – MoshiBin