2010-05-17 15 views
15

Así que aquí es mi código:Desestablecer elemento de la matriz dentro de un bucle foreach

<?php 

$arr = array(array(2 => 5), 
      array(3 => 4), 
      array(7 => 10)); 

foreach ($arr as $v) { 
    $k = key($v); 
    if ($k > 5) { 
     // unset this element from $arr array 
    } 
} 

print_r($arr); 

// now I would like to get the array without array(7 => 10) member 

Como se puede ver, comienzo con una matriz de una sola tecla => matrices de valor, me bucle a través de esta matriz y obtener una clave del elemento actual (que es una matriz de elemento único).

Necesito desarmar los elementos de la matriz con una clave superior a 5, ¿cómo podría hacer eso? También podría necesitar eliminar elementos con valor inferior a 50 o cualquier otra condición. Básicamente, necesito poder obtener una clave del elemento de la matriz actual, que a su vez es una matriz con un solo elemento.

+1

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

Respuesta

39
foreach($arr as $k => $v) { 
    if(key($v) > 5) { 
     unset($arr[$k]); 
    } 
} 
+1

facepalm ... me olvidé por completo de la sintaxis $ k => $ v por un momento, mi memoria está empeorando cada vez más. –

+1

¿Cuál es la diferencia entre usar $ k y la clave ($ v), no son lo mismo? Solo pregunto porque cada ejemplo a continuación también usa la clave ($ v) no sé por qué cuando creo que $ k puede usarse directamente. – Haider

+1

@Haider No entiendes para qué se usa 'key ($ v)'. Obtiene la clave de la sub-matriz que es '$ v', no las claves de la matriz que se itera. Para el primer elemento, '$ k == 0',' $ v == array (2 => 5) ', y' clave ($ v) == 2'. – cincodenada

2

Utilice key() para obtener la primera clave de la sub-matriz.

foreach($arr as $k => $v) { 
    if(key($v) > 5) { 
     unset($arr[$k]); 
    } 
} 
+0

¿A cuál persona votó negativamente esto, puedo preguntar por qué? – Amber

+0

Oye, tu respuesta está editada, copiando mi respuesta :) – sasa

+0

Um, no, en realidad no estaba al tanto de tu respuesta cuando edité mi respuesta. El hecho de que las dos respuestas sean las mismas se debe más al hecho de que la basicidad de la tarea en cuestión hace que muchas personas lo hagan de la misma manera (el interior del ciclo es esencialmente el mismo que antes de editarlo; el exterior es más o menos el estándar para los bucles 'foreach'). – Amber

0

En realidad no es seguro para añadir o eliminar de una colección, mientras que la iteración a través de él. ¿Qué tal si agrega los elementos que desea a una segunda matriz y luego descarga el original?

+2

los bucles 'foreach' en PHP iteran en una copia de la matriz proporcionada por defecto (a menos que se pase explícitamente por referencia). – Amber

+1

referencia vs copia no era mi punto, ni relevante. es una mala forma mutar una matriz durante la iteración. –

+0

Pero, ¿por qué no es seguro? – sasa

14

Se es seguro en PHP para eliminar los elementos de una matriz, mientras que la iteración sobre ella usando bucle foreach:

foreach ($arr as $key => $value) { 
    if (key($value) > 5) { 
     unset($arr[$key]); 
    } 
} 
+2

Tenga en cuenta que esto en realidad no hace lo que quiere el OP (pero su punto es en su mayoría correcto, es seguro hacerlo en el contexto de un bucle 'foreach'; otras formas de iteración no siempre son add/remove-safe) . – Amber

+0

@Amber, gracias, me olvidé del hecho de que se proporciona una matriz de matrices, he corregido el ejemplo. También se agregó una nota sobre el ciclo 'foreach'. –

0

Para unset elemento de la matriz que usamos unset() y la función php, como a continuación:

foreach($array as $key=>$value) 
{ 
    if(key($value) > 5) 
    { 
     unset($array[$key]); 
    } 
} 
Cuestiones relacionadas