Иногда удобно воспользоваться возможностью 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);