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もガンガン使っていけばいいですよね。

初めてのPHP

初めてのPHP

詳細! PHP 7+MySQL 入門ノート

詳細! PHP 7+MySQL 入門ノート