Deshacer los valores de matriz en un bucle foreach

Tengo un bucle foreach configurado para ir a través de mi matriz, buscar un cierto enlace y, si lo encuentra, elimina ese enlace de la matriz.

Mi código:

foreach($images as $image) { if($image == 'http://img.rephp.com/arrays/404.gif' || $image == 'http://img3.abload.de/img/10nx2340fhco.gif' || $image == 'http://img.rephp.com/arrays/404.gif') { unset($images[$image]); } } 

Pero no elimina la matriz. Probablemente sea algo relacionado con $images[$image] , ya que esa no es la clave de la entrada de la matriz, ¿solo el contenido? ¿Hay alguna manera de hacer esto sin incorporar un contador?

Gracias.

EDITAR: Gracias chicos, pero ahora tengo otro problema donde las entradas de la matriz realmente no se eliminan.

Mi nuevo código:

 foreach($images[1] as $key => $image) { if($image == 'http://img.rephp.com/arrays/404.gif') $image == 'http://img3.abload.de/img/10nx2340fhco.gif' || $image == 'http://img.rephp.com/arrays/404.gif') { unset($images[$key]); } } 

$ images es actualmente una matriz bidimensional ahora por lo tanto, necesito $ images [1]. Lo he comprobado y funciona con éxito alrededor de los elementos de la matriz, y algunos elementos realmente tienen algunas de esas URL que deseo eliminar, pero no se eliminan. Esta es mi matriz de $images :

 Array ( [0] => Array ( [0] => useless [1] => useless [2] => useless [3] => useless [4] => useless ) [1] => Array ( [0] => http://i27.tinypic.com/29yk345.gif [1] => http://img3.abload.de/img/10nx2340fhco.gif [2] => http://img3.abload.de/img/10nx2340fhco.gif [3] => http://i42.tinypic.com/9pp2456x.gif ) ) 

¡Gracias!

 foreach($images as $key => $image) { if(in_array($image, array( 'http://img.rephp.com/arrays/404.gif', 'http://img3.abload.de/img/10nxjl0fhco.gif', 'http://img.rephp.com/arrays/9pp2tx.jpg', )) { unset($images[$key]); } } 

Trata eso:

 foreach ($images as $key => &$image) { if (yourConditionGoesHere) { unset($images[$key]) } } 

Normalmente, foreach opera en una copia de su matriz por lo que los cambios que realice se realizan en esa copia y no afectan a la matriz real.

Por lo tanto, debe deshacer los valores mediante $ images [$ key];

La referencia en & $ image evita que el bucle cree una copia de la matriz que desperdiciará la memoria.

$image es en su caso el valor del artículo y no la clave. Use la siguiente syntax para obtener la clave también:

 foreach ($images as $key => $value) { /* … */ } 

Ahora puede eliminar el elemento con unset($images[$key]) .

Puede usar el índice del elemento de la matriz para eliminarlo de la matriz, la próxima vez que use la variable $list , verá que la matriz ha cambiado.

Pruebe algo como esto

 foreach($list as $itemIndex => &$item) { if($item['status'] === false) { unset($list[itemIndex]); } } 

Para responder la pregunta inicial (después de su edición), debe desactivar ($ images [1] [$ key]);

Ahora más información sobre cómo funciona PHP: puede desconectar de manera segura los elementos de la matriz en el bucle foreach, y no importa si tiene o no para el elemento de la matriz. Vea este código:

 $a=[1,2,3,4,5]; foreach($a as $key=>$val) { if ($key==3) unset($a[$key]); } print_r($a); 

Esto imprime:

 Array ( [0] => 1 [1] => 2 [2] => 3 [4] => 5 ) 

Como puede ver, si desarma la cosa correcta dentro del ciclo foreach, todo funciona bien.

También necesitarías un

 $i--; 

después de cada desarmado no saltear un elemento /

Porque cuando desarma $item[45] , el siguiente elemento en for-loop debe ser $item[45] – que fue [46] antes de desarmar. Si no lo hicieras, siempre saltearías un elemento después de desactivarlo.

Una solución sería utilizar la clave de sus elementos para eliminarlos: puede usar tanto las claves como los valores al realizar bucles utilizando foreach .

Por ejemplo :

 $arr = array( 'a' => 123, 'b' => 456, 'c' => 789, ); foreach ($arr as $key => $item) { if ($item == 456) { unset($arr[$key]); } } var_dump($arr); 

Te daré esta matriz, al final:

 array 'a' => int 123 'c' => int 789 

Lo que significa que, en tu caso, algo así debería hacer el truco:

 foreach($images as $key => $image) { if($image == 'http://img.rephp.com/arrays/404.gif' || $image == 'http://img3.abload.de/img/10nx2340fhco.gif' || $image == 'http://img.rephp.com/arrays/404.gif') { unset($images[$key]); } } 
 foreach($images as $key=>$image) { if($image == 'http://img.rephp.com/arrays/404.gif' || $image == 'http://img3.abload.de/img/10nxjl0fhco.gif' || $image == 'http://img.rephp.com/arrays/9pp2tx.jpg') { unset($images[$key]); } }
foreach($images as $key=>$image) { if($image == 'http://img.rephp.com/arrays/404.gif' || $image == 'http://img3.abload.de/img/10nxjl0fhco.gif' || $image == 'http://img.rephp.com/arrays/9pp2tx.jpg') { unset($images[$key]); } } 

!! foreach ($ images as $ key => $ imagen

porque $ image es el valor, por lo que $ images [$ image] no tiene sentido.

Perdón por la respuesta tardía, recientemente tuve el mismo problema con PHP y descubrí que cuando se trabaja con matrices que no usan $key => $value structure, cuando se utiliza el bucle foreach se copia el valor real de la posición en el bucle variable, en este caso $image . Intenta usar este código y solucionará tu problema.

 for ($i=0; $i < count($images[1]); $i++) { if($images[1][$i] == 'http://img.rephp.com/arrays/404.gif' || $images[1][$i] == 'http://img3.abload.de/img/10nx2340fhco.gif' || $images[1][$i] == 'http://img.rephp.com/arrays/404.gif') { unset($images[1][$i]); } } var_dump($images);die();