Отмена значений массива в цикле foreach

У меня есть цикл foreach, настроенный для прохождения через мой массив, проверка на определенную ссылку, и если он обнаружит, что удаляет эту ссылку из массива.

Мой код:

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

Но он не удаляет массив. Вероятно, это связано с $images[$image] , поскольку это не ключ к записи массива, а только контент? Есть ли способ сделать это без включения счетчика?

Благодарю.

EDIT: Спасибо, ребята, но теперь у меня другая проблема, когда записи массива фактически не удаляются.

Мой новый код:

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

$ images теперь является двухмерным массивом, поэтому теперь мне нужны $ images [1]. Я проверил и успешно обходит элементы массива, и некоторые элементы действительно имеют некоторые из этих URL-адресов, которые я хочу удалить, но они не удаляются. Это мой массив $images :

 Array ( [0] => Array ( [0] => useless [1] => useless [2] => useless [3] => useless [4] => useless ) [1] => Array ( [0] => http://img.ruphp.com/php/404.gif [1] => http://img3.abload.de/img/10nx2340fhco.gif [2] => http://img3.abload.de/img/10nx2340fhco.gif [3] => http://img.ruphp.com/php/404.gif ) ) 

Благодаря!

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

Попробуй это:

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

Обычно foreach работает с копией вашего массива, поэтому любые изменения, которые вы делаете, делаются с этой копией и не влияют на фактический массив.

Поэтому вам нужно отключить значения через $ images [$ key];

Ссылка на & $ image не позволяет циклу создать копию массива, которая будет уничтожать память.

$image в вашем случае значение элемента, а не ключа. Для получения ключа также используйте следующий синтаксис:

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

Теперь вы можете удалить элемент с помощью unset($images[$key]) .

Вы можете использовать индекс элемента массива, чтобы удалить его из массива, в следующий раз, когда вы используете переменную $list , вы увидите, что массив изменен.

Попробуйте что-то вроде этого

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

Чтобы ответить на начальный вопрос (после редактирования), вам нужно отменить ($ images [1] [$ key]);

Теперь еще немного информации о том, как работает PHP: вы можете безопасно отключить элементы массива в цикле foreach, и не имеет значения, есть ли у вас или нет элемент массива. Смотрите этот код:

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

Это печатает:

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

Итак, как вы можете видеть, если вы отключаете правильную вещь в цикле foreach, все работает нормально.

Вам также понадобится

 $i--; 

после каждого сброса, чтобы не пропускать элемент /

Потому что, когда вы отменили $item[45] , следующий элемент в for-loop должен быть $item[45] – который был [46] до снятия с охраны. Если вы этого не сделаете, вы всегда будете пропускать элемент после отмены.

Одним из решений было бы использовать ключ ваших элементов, чтобы удалить их – вы можете как ключи, так и значения при циклизации с использованием foreach .

Например :

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

Дает вам этот массив, в конце концов:

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

Это означает, что в вашем случае что-то подобное должно сделать трюк:

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

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

причина $ image – это значение, поэтому $ images [$ image] не имеет смысла.

Извините за поздний ответ, у меня недавно возникла такая же проблема с PHP и выяснилось, что при работе с массивами, которые не используют структуру $key => $value , при использовании цикла foreach вы фактически копируете значение позиции в цикле переменная, в данном случае $image . Попробуйте использовать этот код, и он исправит вашу проблему.

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