Иногда удобно воспользоваться возможностью PHP5 и использовать передачу по ссылке при переборе элементов массива. Например, для обрезания лишних пробелов у всех элементов:
$arr = array('A', 'B', 'C');
foreach ($arr as &$val) {
$val = trim($val);
}
//что есть array_walk я знаю
Всё это очень хорошо, но один раз мне пришлось из-за такой возможности очень несладко. Простейший, код, чтобы показать эффект:
$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);