Отмена значений массива в цикле 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();