Laravelのコレクション(その8:集計・分析)

0
67

Laravelコレクション掘り下げシリーズ第八弾。今回は本体配列内の要素に関する集計・分析を行うメソッドに関して確認していきます。

avg(average)

$col = collect([1,1,2,3,5,8]);
$val = $col->avg(); // 3.3333333333333

平均値を取得できます。
対象が多次元配列の場合は、対象とする要素のキーを指定します。

$col = collect([
    [
        'a' => 1,
        'b' => [
            'b-1' => 2,
            'b-2' => 3,
        ],
    ],
    [
        'a' => 1,
        'b' => [
            'b-1' => 3,
            'b-2' => 5,
        ],
    ],
    [
        'a' => 1,
        'b' => [
            'b-1' => 5,
            'b-2' => 10,
        ],
    ],
]);
$val = $col1->avg('b.b-2'); // 6

count

$col = collect([1,1,2,3,5,8]);
$val = $col1->count(); // 6

要素数を取得できます。
多次元になっていても問題ありません。あくまで一次元目の要素数を取得できるだけですが。

$col = collect([
    'a' => 1,
    'b' => 'abc',
    'c' => [
        'c-1' => 2,
        'c-2' => 'xyz',
    ],
]);
$val = $col->count(); // 3

countBy

$col1 = collect([1,1,2,3,3,3,3]);
$col2 = $col1->countBy();

各値の数を集計し、値をキー、個数を値とする新たなコレクションを生成します。
結果は以下の通り。

array:3 [
  1 => 2
  2 => 1
  3 => 4
]

コールバックを引数とし、同コールバックの戻り値で集計することもできます。

$col1 = collect([1,1,2,3,5,8]);
$col2 = $col1->countBy(function($val) {
    return $val % 3;
});

結果は以下の通り。

array:3 [
  1 => 2
  2 => 3
  0 => 1
]

max

$col = collect([1,1,2,3,5,8])->shuffle();
$val = $col->max(); // 8

最大値を取得できます。
対象が多次元配列の場合は、対象とする要素のキーを指定します。

$col = collect([
    [
        'a' => 1,
        'b' => [
            'b-1' => 2,
            'b-2' => 3,
        ],
    ],
    [
        'a' => 1,
        'b' => [
            'b-1' => 3,
            'b-2' => 5,
        ],
    ],
    [
        'a' => 1,
        'b' => [
            'b-1' => 5,
            'b-2' => 10,
        ],
    ],
]);
$val = $col->max('b.b-2'); // 10

median

$col = collect([1,1,2,3,5,8])->shuffle();
$val = $col->median(); // 2.5

中央値を取得できます。上記のように要素が偶数個の場合は中央の前後(上記例では2と3)の要素の中間の値になります。
対象が多次元配列の場合は、対象とする要素のキーを指定します。

$col = collect([
    [
        'a' => 1,
        'b' => [
            'b-1' => 2,
            'b-2' => 3,
        ],
    ],
    [
        'a' => 1,
        'b' => [
            'b-1' => 3,
            'b-2' => 5,
        ],
    ],
    [
        'a' => 1,
        'b' => [
            'b-1' => 5,
            'b-2' => 10,
        ],
    ],
]);
$val = $col->median('b.b-2'); // 5

min

$col = collect([1,1,2,3,5,8])->shuffle();
$val = $col1->min(); // 1

最小値を取得できます。
対象が多次元配列の場合は、対象とする要素のキーを指定します。

$col = collect([
    [
        'a' => 1,
        'b' => [
            'b-1' => 2,
            'b-2' => 3,
        ],
    ],
    [
        'a' => 1,
        'b' => [
            'b-1' => 3,
            'b-2' => 5,
        ],
    ],
    [
        'a' => 1,
        'b' => [
            'b-1' => 5,
            'b-2' => 10,
        ],
    ],
]);
$val = $col->min('b.b-2'); // 3

mode

$col = collect([1,1,2,3,3,3,3])->shuffle();
$result = $col->mode(); // [3]

最頻値を取得できます…が、avgやmedianなどと異なり、本メソッドのみ戻りが配列です(なぜだ?)
対象が多次元配列の場合は、対象とする要素のキーを指定します。

$col = collect([
    [
        'b' => [
            'b-1' => 1,
            'b-2' => 2,
        ],
    ],
    [
        'b' => [
            'b-1' => 1,
            'b-2' => 3,
        ],
    ],
    [
        'b' => [
            'b-1' => 2,
            'b-2' => 3,
        ],
    ],
    [
        'b' => [
            'b-1' => 2,
            'b-2' => 4,
        ],
    ],
]);
$result = $col->mode('b.b-2'); // [3]

sum

$col = collect([1,1,2,3,5,8])->shuffle();
$result = $col->sum(); // 20

合計値を取得できます。
対象が多次元配列の場合は、対象とする要素のキーを指定します。

$col = collect([
    [
        'a' => 1,
        'b' => [
            'b-1' => 2,
            'b-2' => 3,
        ],
    ],
    [
        'a' => 1,
        'b' => [
            'b-1' => 3,
            'b-2' => 5,
        ],
    ],
    [
        'a' => 1,
        'b' => [
            'b-1' => 5,
            'b-2' => 10,
        ],
    ],
]);
$val = $col->sum('b.b-2'); // 18

コールバックを指定することで、その戻り値の合計を求めることもできます。

$col = collect([1,1,2,3,5,8])->shuffle();
$result = $col->sum(function($val) {
    return $val * 2;
}); // 40

総括

このカテゴリのメソッドは直感的に分かりやすいものばかりなので、すぐに覚えて、使えると思います。
modeの戻り値が配列となる点だけが唯一の汚点ですが…(使い方を間違う自信あり)。