Удаление элемента в цикле foreach в PHP

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

foreach ($array as $element) {
    if (conditions) {
        unset($element);
    }
}

Но после этого элемент не сбрасывается. Что я делаю неправильно? Я снимаю ссылку на фактический элемент или что-то в этом роде?


person federico-t    schedule 21.01.2012    source источник
comment
Вам не все равно, установлен ли индекс? $array[4]=NULL !== !isset($array[4])   -  person Shad    schedule 21.01.2012
comment
unset делает 2 разные вещи. Если бы вы использовали foreach($array as &$element) (обратите внимание на амперсанд), вы бы заменили значение на null, что является другим поведением, чем то, которое вы можете выполнить: удаление элемента из массива полностью, без следа.   -  person bart    schedule 21.01.2012


Ответы (2)


Простое решение, отключите элемент по его индексу:

foreach ($array as $key => $element) {
    if (conditions) {
        unset($array[$key]);
    }
}

Просто сбросить $element не получится, потому что эта переменная не является ссылкой на элемент массива, а его копией. Соответственно, изменение значения $element тоже не изменит массив.

person DerVO    schedule 21.01.2012
comment
Спасибо, что решили мою проблему! - person federico-t; 21.01.2012

В качестве альтернативного метода вы можете передать элемент массива в цикл по ссылке, выполнив следующие действия:

foreach($array as &$var) {
    unset($var);
}

Это полезно, потому что тогда у вас есть прямой доступ к элементу массива для изменения или удаления по вашему желанию без необходимости создавать новый массив или доступа по ключу. Любые изменения, которые вы вносите в $ var, влияют на содержимое $ array.

person Gabriel Alack    schedule 05.11.2013
comment
Это просто отключит ссылку, а не исходный элемент. - person alingex; 08.08.2017