Итерация по массиву, значения по ссылке.

Иногда удобно воспользоваться возможностью PHP5 и использовать передачу по ссылке при переборе элементов массива. Например, для обрезания лишних пробелов у всех элементов:

$arr = array('A', 'B', 'C');
foreach ($arr as &$val) {
    $val = trim($val);
}

Всё это очень хорошо, но один раз мне пришлось из-за такой возможности очень несладко. Простейший, код, чтобы показать эффект:

$arr = array('A', 'B', 'C');
foreach ($arr as &$val) {}
foreach ($arr as $val) {}
var_dump($arr);
array

  0 => string 'A' (length=1)

  1 => string 'B' (length=1)

  2 => &string; 'B' (length=1)

Тогда я вместо var_dump использовал print_r и не увидел &… На самом деле объяснение логичное: после первого цикла $val — ссылка на последний элемент массива. При второй итерации по этой ссылке начнут записываться значения, изменяя массив. Решается проблема так:

$arr = array('A', 'B', 'C');
foreach ($arr as &$val) {}
unset($val);
foreach ($arr as $val) {}
var_dump($arr);

Записи