2010-06-16 13 views
15

estoy accediendo a una matriz por referencia dentro de un bucle foreach, pero no parece la función unset() para trabajar:Desestablecer un elemento de matriz dentro de un bucle foreach

foreach ($this->result['list'] as &$row) { 
    if ($this_row_is_boring) { 
     unset($row); 
    } 
} 

print_r($this->result['list']); // Includes rows I thought I unset 

ideas? ¡Gracias!

Respuesta

30

Está deshaciendo la referencia (rompiendo la referencia). Que había necesidad de no definidas sobre la base de una clave:

foreach ($this->result['list'] as $key => &$row) { 
    if ($this_row_is_boring) { 
     unset($this->result['list'][$key]); 
    } 
} 
+5

Cabe destacar que los índices de matriz se conservan, incluso si no se especificaron (índices numéricos automáticos) cuando se inicializó la matriz. Es decir, no volverá a organizar las teclas de matriz numéricas para que sean secuenciales. – amphetamachine

7
foreach ($this->result['list'] as $key => &$row) { 
    if ($this_row_is_boring) { 
     unset($this->result['list'][$key]); 
    } 
} 
unset($row); 

Recuerde: si está utilizando un foreach con una referencia, se debe utilizar desarmar a eliminar la referencia de modo que foreach no copia el siguiente en encima de eso. More info

+1

Ummm, si está utilizando un foreach con una referencia, no necesita desconectarlo en cada ciclo. PHP hace eso automáticamente. Deberías desreferenciar ** después de ** el ciclo. – ircmaxell

+0

Eso es cierto ... fue un error tipográfico. – Cristian

4

Una pequeña explicación para las respuestas anteriores.

Después de unset($row), la variable $row está desactivada. Eso no significa que se eliminen los datos en $row; la lista también tiene un elemento que apunta al $row.

Ayuda a pensar en las variables como etiquetas. Una pieza de datos puede tener una o más etiquetas, y unset elimina esa etiqueta pero no toca los datos reales. Si se eliminan todas las etiquetas, los datos se eliminan automáticamente.

Cuestiones relacionadas