見出し画像

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を諦める。
多分、動くと思います。
(試していない)

この記事が気に入ったらサポートをしてみませんか?