Отмена значений массива в цикле foreach
У меня есть цикл foreach, настроенный для прохождения через мой массив, проверка на определенную ссылку, и если он находит, удаляет эту ссылку из массива.
Мой код:
foreach($images as $image)
{
if($image == 'http://i27.tinypic.com/29yk345.gif' ||
$image == 'http://img3.abload.de/img/10nx2340fhco.gif' ||
$image == 'http://i42.tinypic.com/9pp2456x.gif')
{
unset($images[$image]);
}
}
Но он не удаляет массив. Вероятно, это связано с $images[$image]
, поскольку это не ключ записи массива, а только контент? Есть ли способ сделать это без включения счетчика?
Спасибо.
EDIT: Спасибо, ребята, но теперь у меня другая проблема, когда записи массива фактически не удаляются.
Мой новый код:
foreach($images[1] as $key => $image)
{
if($image == 'http://i27.tinypic.com/29yk345.gif')
$image == 'http://img3.abload.de/img/10nx2340fhco.gif' ||
$image == 'http://i42.tinypic.com/9pp2456x.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://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
)
)
Спасибо!
Ответы
Ответ 1
foreach($images as $key => $image)
{
if(in_array($image, array(
'http://i27.tinypic.com/29ykt1f.gif',
'http://img3.abload.de/img/10nxjl0fhco.gif',
'http://i42.tinypic.com/9pp2tx.gif',
))
{
unset($images[$key]);
}
}
Ответ 2
Попробуйте следующее:
foreach ($images as $key => &$image) {
if (yourConditionGoesHere) {
unset($images[$key])
}
}
Обычно foreach работает с копией вашего массива, поэтому любые изменения, которые вы делаете, делаются с этой копией и не влияют на фактический массив.
Итак, вам нужно сбросить значения через $images [$ key];
Ссылка на & $image не позволяет циклу создать копию массива, которая будет отнимать память.
Ответ 3
$image
находится в вашем случае значение элемента, а не ключа. Для получения ключа также используйте следующий синтаксис:
foreach ($images as $key => $value) {
/* … */
}
Теперь вы можете удалить элемент с помощью unset($images[$key])
.
Ответ 4
Вы можете использовать индекс элемента массива, чтобы удалить его из массива, в следующий раз, когда вы используете переменную $list
, вы увидите, что массив изменен.
Попробуйте что-то вроде этого
foreach($list as $itemIndex => &$item) {
if($item['status'] === false) {
unset($list[itemIndex]);
}
}
Ответ 5
Чтобы ответить на начальный вопрос (после редактирования), вам нужно отменить ($ 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, все работает нормально.
Ответ 6
Вам также понадобится
$i--;
после каждого сброса, чтобы не пропустить элемент /
Потому что, когда вы отключаете $item[45]
, следующий элемент в цикле for должен быть $item[45]
- который был [46]
до отмены. Если вы этого не сделаете, вы всегда пропустите элемент после отмены.
Ответ 7
foreach($images as $key=>$image)
{
if($image == 'http://i27.tinypic.com/29ykt1f.gif' ||
$image == 'http://img3.abload.de/img/10nxjl0fhco.gif' ||
$image == 'http://i42.tinypic.com/9pp2tx.gif')
{ unset($images[$key]); }
}
!! foreach ($ images as $key = > $image
cause $image - это значение, поэтому $images [$ image] не имеет смысла.
Ответ 8
Одним из решений было бы использовать ключ ваших элементов для их удаления - вы можете использовать оба ключа и значения при циклическом использовании с помощью foreach.
Например:
$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://i27.tinypic.com/29yk345.gif' ||
$image == 'http://img3.abload.de/img/10nx2340fhco.gif' ||
$image == 'http://i42.tinypic.com/9pp2456x.gif')
{
unset($images[$key]);
}
}
Ответ 9
Извините за поздний ответ, у меня недавно возникла такая же проблема с PHP и выяснилось, что при работе с массивами, которые не используют структуру $key => $value
, при использовании цикла foreach
вы фактически копируете значение позиции на переменная цикла, в данном случае $image
. Попробуйте использовать этот код, и он устранит вашу проблему.
for ($i=0; $i < count($images[1]); $i++)
{
if($images[1][$i] == 'http://i27.tinypic.com/29yk345.gif' ||
$images[1][$i] == 'http://img3.abload.de/img/10nx2340fhco.gif' ||
$images[1][$i] == 'http://i42.tinypic.com/9pp2456x.gif')
{
unset($images[1][$i]);
}
}
var_dump($images);die();