配列の中身をすべて書き換えたい
例えば、数字が入った配列をすべて2倍にしたい。
[1, 2, 3, 4]
が、 [2, 4, 6, 8]
になるようにしたい。
1.forと配列のインデックスを使う
$array1 = [1, 2, 3, 4]; $array_length = count($array1); for($i = 0; $i < $array_length; $i++) { $array1[$i] = $array1[$i] * 2; } var_dump($array1);
$array_lengthで配列の最大の値を取って、ひたすら処理を回す。
良い点は、順番の値である $i
変数を使った処理が書ける。
悪い点は、countで最大値を取ってfor文を回しているので、穴あきの配列を使うと動かない。
2.foreachを使う
$array2 = [1, 2, 3, 4]; foreach ($array2 as &$value) { $value = $value * 2; } unset($value); var_dump($array2);
foreachで取り出す$valueの部分をリファレンス参照にする。
すると、配列の各値の参照先を直接取得・書き換えることが出来るので、
データの書き換えが可能。
良い点は、穴あきの配列でも動く。array以外にも、foreachで回せるオブジェクトでも対応可能。
悪い点は、参照渡しなので、unsetで値を開放しそこねると、思わぬバグが生まれたり、値の書き換えだけにしか使えない。
使い方を間違えなければ結構良さそう。
ただ、もとの配列を書き換えたくないときとかには次の書き方の方が良さそう。
3.array_mapで関数を回す
function double(int $num) { return $num * 2; } $array3 = [1, 2, 3, 4]; $array3 = array_map("double", $array3); var_dump($array3);
配列の各要素に動かしたい関数を渡す。
良い点は、関数の処理の使い回しもできるし、コードが心なしか読みやすい?
悪い点は、arrayにしか使えない。2.のようにオブジェクトにはこの手は使えない。
使い分けよう
良い点悪い点を私の主観で書きましたが、どれも良い点悪い点がありますので、うまく使い分けていきましょう(‘ω‘ )
他にも良い書き方がありましたら、ぜひ教えてください!
参考公式ドキュメント
2.の参考
https://www.php.net/manual/ja/control-structures.foreach.php