PHPの連想配列の集計 [2015/05/22]
PHPでの連想配列の縦合計を集計する方法をいくつか書いてみました。
PHP5.6を使用し、500万行の連想配列で実行時間とメモリ使用量を測定してます。(Scalaはこちら)

■type1(foreachループ)
→ 1.7秒平均。445MB。
■type1-2(forループ)
→ 1.7秒平均。0.002MB。
■type2(array_reduceで関数型っぽく)
→ 2.7秒平均。0.002MB。
■type3(無名関数とarray_reduceで関数型っぽく)
→ 2.6秒平均。0.003MB
■type4(php5.5以上でのarray_column使用)
→ 1.7秒平均。445MB。

という結果になりました。
・foreach ( $data as $row ) という書き方は非常にメモリを消費する。
・同じループでも for文ならメモリは消費しない。
・array_reduce はfor文と比べ高速ではないが、メモリ使用量は遜色なし。
・array_column は内部的に配列のコピーを取ってようで、メモリ消費量が大きい。

→ 処理速度・メモリ消費量ともfor文が最高。
→ array_reduce でも大差はない。関数型のコーディングで統一するならループをなくし、この書き方でもよいのでは。
→ array_columnはNG。

//■type1(foreachループ)
function getFieldSumType1( $data )
{
    $sum = 0;
    foreach ( $data as $row )
    {
        $sum += (int)$row["value"];
    }
    return $sum;
}
echo getFieldSumType1( $rows );

//■type1-2(forループ)
function getFieldSumType12( $data )
{
    $sum = 0;
    for ( $i = 0; $i < count($data); $i++ )
    {
        $sum += (int)$data[ $i ]["value"];
    }
    return $sum;
 }
 echo getFieldSumType12( $rows );

//■type2(array_reduce)
function getFieldSumType2( $carry, $item )
{
    $carry += (int)$item["value"];
    return $carry;
};
echo array_reduce( $rows, "getFieldSumType2", 0 );

//■type3(無名関数でarray_reduce)
function getFieldSumType3( $data, $field )
{
    $sum3 = array_reduce( $data, function ( $carry, $item ) use ( $field )
    {
        $carry += (int)$item[ $field ];
        return $carry;
    }, 0 );
    return $sum3;
};
echo getFieldSumType3( $rows, "value");

//■type4(php5.5以上でarray_column使用)
echo array_sum( array_column( $rows, "value") );