Unset элемент массива внутри цикла 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

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

3 ответов


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

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

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

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


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

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

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