2010-02-21 5 views
111

I itere a través de una matriz de objetos y desea eliminar uno de los objetos en función de su propiedad 'id', pero mi código no funciona.¿Cómo eliminar el objeto de la matriz dentro del bucle foreach?

foreach($array as $element) { 
    foreach($element as $key => $value) { 
     if($key == 'id' && $value == 'searched_value'){ 
      //delete this particular object from the $array 
      unset($element);//this doesn't work 
      unset($array,$element);//neither does this 
     } 
    } 
} 

Cualquier sugerencia. Gracias.

+2

posible duplicado de [¿Cómo se elimina un elemento de matriz en un foreach loop?] (http://stackoverflow.com/questions/1949259/how-do-you-remove-an-array-element-in-a-foreach-loop) – 7hi4g0

Respuesta

181
foreach($array as $elementKey => $element) { 
    foreach($element as $valueKey => $value) { 
     if($valueKey == 'id' && $value == 'searched_value'){ 
      //delete this particular object from the $array 
      unset($array[$elementKey]); 
     } 
    } 
} 
+46

¿Es seguro eliminar un elemento de una matriz dentro de un bucle foreach de la misma matriz? –

+14

@Oliver: generalmente generará un comportamiento inesperado, pero puede hacerlo de manera segura con foreach en php. Da una lectura aquí para una prueba: http://php.net/manual/es/control-structures.foreach.php#88578 – pangon

+0

Esto está convirtiendo mi matriz en objeto en CodeIgniter. ¿Cualquier sugerencia? – Paritosh

1

No soy mucho de un programador php, pero puedo decir que en C# no se puede modificar una matriz mientras se itera a través de ella. Es posible que desee intentar usar su ciclo foreach para identificar el índice del elemento o los elementos que desea eliminar, luego elimine los elementos después del ciclo.

+12

Si bien es una mala práctica en la mayoría de los idiomas, las matrices en PHP son básicamente matrices asociativas que se pueden iterar en orden. Eliminar un elemento anterior no cambia las claves de los elementos que vienen después. –

+19

En realidad, está permitido porque la matriz que foreach usa internamente es una copia de la matriz original. De esa forma, modificar la matriz original es perfectamente seguro. – Juan

+58

En realidad, está permitido porque php está loco como el infierno. –

1

Parece que su sintaxis para el desarmado no es válida, y la falta de reindexación podría causar problemas en el futuro. Ver: the section on PHP arrays.

La sintaxis correcta se muestra arriba. También tenga en cuenta array-values para reindexar, por lo que nunca indexará algo que haya eliminado previamente.

1

Esto debería hacer el truco .....

reset($array); 
while (list($elementKey, $element) = each($array)) { 
    while (list($key, $value2) = each($element)) { 
     if($key == 'id' && $value == 'searched_value') { 
      unset($array[$elementKey]); 
     } 
    } 
} 
4

También puede utilizar referencias en foreach valores:

foreach($array as $elementKey => &$element) { 
    // $element is the same than &$array[$elementKey] 
    if (isset($element['id']) and $element['id'] == 'searched_value') { 
     unset($element); 
    } 
} 
+4

elemento $ (utilizado dentro y fuera del foreach) es solo una referencia a cada elemento en el conjunto. unset ($ element) simplemente romperá la referencia, no destruye el elemento al que se hace referencia de su matriz. – Nicholas

+1

Pero '$ element = null' funcionaría? –

+1

@Dev_NIX '$ element = null' NO funcionaría, la longitud de' $ array' sigue siendo la misma, solo contendría nulos –

Cuestiones relacionadas