PHPの連想配列をforeachで更新しようとしたが変更が反映されない、書き方は4つありそう
詰まったので、先人の知恵をまとめます。
PHPの連想配列が変更できない
foreach ($array as $value) {
$value = $value . '書き換えた';
}
まず、上記のようにしても「書き換えた」は反映されません。
これの対策を4つ書いていきます。
(うち、2つしか試していません)
①参照渡しで更新する
foreach ($array as &$value) {
$value = $value . '書き換えた';
}
unset($value);
のようにします。
「&$value」が参照渡しにしている部分。
「unset($value);」は変数をリセットしている。
リセットしないと不具合が起きます。
自分の場合は、多重ループの中でunsetなしで使った結果、
配列をvar_dumpすると正しい内容が出力されるが、
foreachしてechoすると、4番目の要素が5番目にコピーされてるような出力になりました。
②キーを使う
foreach ($array as $key => $value) {
$array[$key] = $value . '書き換えた';
}
このように書いても反映されます。
これがおすすめ。
ここまでのコードは以下の記事から拝借しました。
③別の配列を使う
$array2 = [];
foreach ($array as $key => $value) {
$array2[$key] = $value . '書き換えた';
}
コピー先を新しい配列にしちゃいます。
試してないけど問題なく動きそう。
AIが提案してくれました。
④for文を使う
for ($i = 0; $i < count($array); $i++) {
$array[$i] = $array[$i] . '書き換えた';
}
foreachを諦める。
多分、動くと思います。
(試していない)
この記事が気に入ったらサポートをしてみませんか?