肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

foreach 中に変更するべき要素を見つけて取っておきたい

単純化すると、配列に入っているオブジェクトを舐めて、
条件を満たすものを取り出してそれを後で変更したい、みたいなコードを書く。
とりだしたもののオブジェクトの状態を変更。
で、大本の配列を回してみたら中身かわってねえ……。
要するにPHPの参照の挙動なんですが、
なんでこんなことに。

PHPの参照が使いにくい件について - 神様なんて信じない僕らのために

foreach で参照とると地雷があったりするので(気づいてらっしゃるっぽいけど),こういう場合は,キーを保存してくのがわりとよくやるやり方かな.

<?php
$hoge_list = array(
    array('Hoge'=>array('value'=>100)),
    array('Hoge'=>array('value'=>101)),
    array('Hoge'=>array('value'=>102)),
    array('Hoge'=>array('value'=>103)),
    array('Hoge'=>array('value'=>104)),
);

echo "----- Before -----\n";

$select_hoge_key = null;
foreach ($hoge_list as $key => $hoge) {
    echo $hoge['Hoge']['value']."\n";
    if ($hoge['Hoge']['value'] == 100) {
        $select_hoge_key = $key; // キーを保存
    }   
}

$hoge_list[$select_hoge_key]['Hoge']['value'] = 999;

echo "----- After -----\n";                                                                                                                                                 

foreach ($hoge_list as $hoge) {
    echo $hoge['Hoge']['value']."\n";
}

PHPはオブジェクト以外基本的に値渡しだし,参照周りは色々ドロドロしてるし,スコープもすごい(w)から,こういう方向のほうが安全かもですね.
あ,望んでいることが違ったらごめんなさいですけど.