array_mapよりはforeachがいいけどforeachよりはarray_walkで書きたい #PHP
基本的にはarray_mapが使えそうなケースでも素直にforeachを使いたい人です。
array_mapは考えて記述していかないと可読性が悪くなりがちだし、パフォーマンスもforeachのほうが良いし。。
ただarray_walkに関しては使っていきたいと思える部分があって、それはunsetすることを意識しなくていいってところです。
foreachで参照渡しするときに起こりうる問題
foreachで配列の破壊的操作をしたい場合は例えば以下のように書くことになりますが、意識しなければいけないのは、ループを終えたあとにunsetによって参照を解除しなければならないということ。
<?php $arr = range(1, 4); foreach ($arr as &$value) { $value = $value * 2; } unset($value); // 最後の要素への参照を解除します print_r($arr); // Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 8 )
もしunsetしなかったら次のようなコードを書いたときにアカンことになります。
<?php $arr = range(1, 4); foreach ($arr as &$value) { $value = $value * 2; } // ここまで同じ // ここで unset しない $value = 1000; print_r($arr); // Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 1000 ) // $valueは$arr[3]を参照したままなので値が書き換わってしまっている
array_walk使えばunsetいらない
先に挙げたようにPHPの場合foreachは中と外で同一スコープとなってしまうのでunsetしておく必要があります。
ですが、array_walkを使えばスコープは別なのでunsetする必要がないです。
<?php $arr = range(1, 4); array_walk($arr, function(&$value) { $value = $value * 2; }); // unsetとかいらない $value = 1000; print_r($arr); // Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 8 )
わざわざunsetしなきゃいけないってのがなくなったので、ちょっぴり気持ちよくなりました。
とまぁそんな感じなんですが
別に気をつければforeachでも全然良いし、array_mapもガンガン使っていけばいいですよね。
- 作者: David Sklar,桑村潤,廣川類,木下哲也
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/03/18
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
- 作者: 大重美幸
- 出版社/メーカー: ソーテック社
- 発売日: 2016/07/01
- メディア: 単行本
- この商品を含むブログを見る