2009-06-30 15 views
7

Tengo una función que extrae filas de una base de datos, content-> id y content-> type las usa para llamar dinámicamente a amethod en un modelo ya cargado para obtener y formatear los detalles de los objetos . Una vez que se devuelve el objeto, se agrega a la matriz. Todo está bien, excepto que cuando uso el conjunto aunque tenga el número correcto de elementos, todos contienen el mismo objeto aunque sé que se devuelven de forma diferente. Estoy completamente perdido con esta, ¡cualquier ayuda/idea sería genial!Almacenamiento de objetos en una matriz con php

El código es el siguiente:

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

Y las declaraciones print_r producir este: referencias

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

¿Es esto una copia verdadera de su código? – cgp

Respuesta

13

yo supongo que el problema es que se llega a un mismo objeto cada vez que por referencia de la función get y después añadirlo por referencia a la matriz, lo que resulta en todos los elementos de la matriz que se modifique el artículo se modifica en la función get. Si ese es el caso, lo siguiente debe funcionar:

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

¡perfecto! esto funcionó: $ items [] = clone ($ item); –

3

Usted probablemente Volviendo al tema, no los artículos ellos mismos. Siempre será la última referencia a la que apunta $ item.

4

Cuando se presiona $ item a $ artículos, no empuja los puntos valor $ item, sino más bien a la propia referencia. Tendrá que inicializar $ item cada vez:

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

Pensé que algo así sería el problema, pero inicializarlo no funcionaba. $ items [] = clone ($ item) hizo sin embargo –

+0

En el segundo examen es fácil entender por qué este método no funcionará; $ items es una matriz llena con $ item, que sigue siendo una referencia. La reinicialización de $ item significa que todos los artículos seguirán refiriéndose al mismo objeto. Como se dijo anteriormente, clone() es el camino :) – MoshiBin

Cuestiones relacionadas