recorrer multidimensional length index crear con asociativo array php arrays loops foreach

php - multidimensional - ¿Cómo se elimina un elemento de matriz en un bucle foreach?



php array push (8)

Como ya se ha mencionado, querría hacer un foreach con la clave y deshacer el uso de la clave, pero tenga en cuenta que mutar una matriz durante la iteración es en general una mala idea, aunque no estoy seguro de las reglas de PHP sobre este tema. de improviso.

Quiero recorrer una matriz con foreach para verificar si existe un valor. Si el valor existe, quiero eliminar el elemento que lo contiene.

Tengo el siguiente código:

foreach($display_related_tags as $tag_name) { if($tag_name == $found_tag[''name'']) { // Delete element } }

No sé cómo eliminar el elemento una vez que se encuentra el valor. ¿Cómo lo borro?

Tengo que usar foreach para este problema. Probablemente haya alternativas para foreach , y le invitamos a compartirlas.


En lugar de hacer el bucle foreach () en la matriz, sería más rápido usar array_search () para encontrar la clave adecuada. En arreglos pequeños, iría con foreach para una mejor lectura, pero para arreglos más grandes, o código ejecutado a menudo, esto debería ser un poco más óptimo:

$result=array_search($unwantedValue,$array,true); if($result !== false) { unset($array[$result]); }

El operador estricto de comparsión! == es necesario, porque array_search () puede devolver 0 como el índice de $ unwantedValue.

Además, el ejemplo anterior eliminará solo el primer valor $ valor no deseado, si el valor $ indeseado puede aparecer más de una vez en $ array, debe usar array_keys () para encontrarlos a todos:

$result=array_keys($array,$unwantedValue,true) foreach($result as $key) { unset($array[$key]); }

Visite http://php.net/manual/en/function.array-search.php para obtener más información.


Intenta usar las funciones next() , current() en while , for cycle.


Si también obtienes la clave, puedes eliminar ese artículo como este:

foreach ($display_related_tags as $key => $tag_name) { if($tag_name == $found_tag[''name'']) { unset($display_related_tags[$key]); } }


Una mejor solución es usar la función array_filter :

$display_related_tags = array_filter($display_related_tags, function($e) use($found_tag){ return $e != $found_tag[''name'']; });

Como dice la documentación de php:

Como foreach depende del puntero del arreglo interno en PHP 5, cambiarlo dentro del ciclo puede conducir a un comportamiento inesperado.


Ya hay respuestas que están dando luz sobre cómo desarmar. En lugar de repetir el código en todas sus clases, haga que funcione como se indica a continuación y úselo en el código cuando sea necesario. En lógica comercial, a veces no quiere exponer algunas propiedades. Por favor, consulte a continuación una llamada de línea para eliminar

public static function removeKeysFromAssociativeArray($associativeArray, $keysToUnset) { if (empty($associativeArray) || empty($keysToUnset)) return array(); foreach ($associativeArray as $key => $arr) { if (!is_array($arr)) { continue; } foreach ($keysToUnset as $keyToUnset) { if (array_key_exists($keyToUnset, $arr)) { unset($arr[$keyToUnset]); } } $associativeArray[$key] = $arr; } return $associativeArray; }

Llamar como:

removeKeysFromAssociativeArray($arrValues, $keysToRemove);


si tiene un escenario en el que tiene que eliminar más de un valor de la matriz foreach en este caso, debe pasar el valor por referencia para cada uno: Intento explicar este escenario:

foreach ($manSkuQty as $man_sku => &$man_qty) { foreach ($manufacturerSkus as $key1 => $val1) { // some processing here and unset first loops entries // here dont include again for next iterations if(some condition) unset($manSkuQty[$key1]); } } }

en el segundo bucle, desea deshacer las primeras entradas de bucles, no volverán a aparecer en la iteración para fines de rendimiento, o bien, también se desarmará de la memoria porque en la memoria se presentarán y aparecerán en iteraciones.


foreach($display_related_tags as $key => $tag_name) { if($tag_name == $found_tag[''name'']) unset($display_related_tags[$key]; }