phpのクロージャのレキシカル変数の扱いで、はまったので記録を残しておきます。
先頭から現在までの合計を計算する場合、
以下のようにすると、
sum1.php
<?php
$sum = 0;
var_dump(
array_map(
function($v) use ($sum) { $sum =+ $v; return $sum; },
range(1, 10)
)
);
array(10) {
[0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5)
[5]=> int(6) [6]=> int(7) [7]=> int(8) [8]=> int(9) [9]=> int(10)
}
となってしまいます。
正しく合計を求めたい場合は、以下のように参照渡しする必要があります(thanks! @neuecc)。
sum2.php
<?php
$sum = 0;
var_dump(
array_map(
function ($v) use (&$sum) { return $sum += $v;},
range(1, 10)
)
);
array(10) {
[0]=> int(1) [1]=> int(3) [2]=> int(6) [3]=> int(10) [4]=> int(15) [5]=> int(21)
[6]=> int(28) [7]=> int(36) [8]=> int(45) [9]=> int(55)
}
公式マニュアルのサンプルでもそうなってますね。