Отменить элемент массива внутри цикла foreach

Я получаю доступ к массиву по ссылке внутри цикла foreach, но функция unset(), похоже, не работает:

foreach ( $this->result['list'] as &$row ) {
    if ($this_row_is_boring) {
        unset($row);
    }
}

print_r($this->result['list']); // Includes rows I thought I unset

Идеи? Спасибо!

Ответы

Ответ 1

Вы не устанавливаете ссылку (нарушая ссылку). Вам нужно отменить на основе ключа:

foreach ($this->result['list'] as $key => &$row) {
    if ($this_row_is_boring) {
        unset($this->result['list'][$key]);
    }
}

Ответ 2

foreach ($this->result['list'] as $key => &$row) {
    if ($this_row_is_boring) {
        unset($this->result['list'][$key]);
    }
}
unset($row);

Помните: если вы используете foreach со ссылкой, вы должны использовать unset для разыменования, чтобы foreach не копировал следующий поверх него. Дополнительная информация

Ответ 3

Немного объяснения ответов выше.

После unset($row) переменная $row не установлена. Это не означает, что данные в $row удаляются; в списке также есть элемент, указывающий на $row.

Это помогает думать о переменных как меток. Часть данных может содержать одну или несколько меток, а unset удаляет эту метку, но не касается фактических данных. Если все метки удалены, данные автоматически удаляются.