2010-06-16 2 views
15

Я обращающегося массив по ссылке внутри цикла Еогеасп, но функция не установлена ​​(), кажется, не работает: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 

Идеи? Благодаря!

ответ

30

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

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

Следует отметить, что индексы массивов сохраняются, даже если вы не указали их (автоматические числовые индексы) при инициализации массива. То есть он не будет реорганизовывать числовые ключи массива, чтобы они были последовательными. – amphetamachine

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

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

+1

Ummm, если вы используете foreach со ссылкой, вам не нужно его устанавливать в каждом цикле. PHP делает это автоматически. Вы должны разыгрывать это ** после ** цикла. – ircmaxell

+0

Это правда ... это была опечатка. – Cristian

4

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

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

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

Смежные вопросы