2009-06-30 17 views
7

Ho una funzione che richiama le righe da un database, il tipo content-> id e content-> sono usati per chiamare dinamicamente amethod in un modello già caricato per ottenere e formattare i dettagli degli oggetti . Una volta restituito l'oggetto, viene aggiunto all'array. Tutto va bene, tranne che quando vengo ad utilizzare l'array nonostante abbia il numero corretto di elementi in esso contenuti, tutti contengono lo stesso oggetto anche se so che vengono restituiti diversi. Sono completamente perso con questo, qualsiasi aiuto/idee sarebbe fantastico!Memorizzazione di oggetti in un array con php

Il codice è qui sotto:

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

E le dichiarazioni print_r produrre questo: riferimenti

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

E 'una copia fedele del tuo codice? – cgp

risposta

13

direi che il problema è che si arriva allo stesso oggetto ogni volta con riferimento dalla funzione get e poi aggiungo con riferimento alla matrice, con conseguente tutti gli elementi dell'array venga modificato quando l'articolo viene modificato nella funzione get. Se questo è il caso, la seguente dovrebbe funzionare:

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

perfetto! questo ha funzionato: $ items [] = clone ($ item); –

3

Probabilmente si sta tornando al punto, non gli oggetti stessi. Sarà sempre l'ultimo riferimento a cui punta l'oggetto $.

4

Quando si preme $ item a $ articoli, ma non spinge i punti di valore di $ voce a, ma piuttosto il riferimento stesso. Avrai bisogno di inizializzare $ item ogni volta:

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

Ho pensato che qualcosa del genere sarebbe stato il problema ma inizializzarlo ogni volta non funzionava. $ items [] = clone ($ item) ha comunque –

+0

Al secondo esame è facile capire perché questo metodo non funziona; Gli articoli $ sono un array riempito con $ item, che è ancora un riferimento. Reinizializzare $ item significa che tutti gli oggetti si riferiscono ancora allo stesso oggetto. Come detto sopra, clone() è il modo :) – MoshiBin

Problemi correlati