foreach ($array as $value) {} 構文の中では、$value の値を変更しても元の配列の値は変更されません。$value に代入されているのは、配列の要素の「値のコピー」だからです。便利だからといっていつもforeach文を使っていると、ついこのことを忘れそうです。
他の言語の同種の構文も調べてみましたが、VBのFor Each、JavaScriptのfor、Javaの拡張For文なども、やはり全て同じ仕様のようです。
ちなみに、PHP5以降の場合、foreach ($array as &$value) {} として$valueに参照を代入すれば、$valueへの変更を配列に反映させることができます。
see PHPマニュアル

