У меня есть цикл 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();