Help us understand the problem. What is going on with this article?

Laravel Collectionのメソッドの引数にcallbackを与えてパワフルに使う

コレクション 5.8 Laravel のメソッドの解説では省かれてしまっているけど、コレクションの持つ多くのメソッドは引数にcallableを受け取ることができる。

自分で実際に使って「しゅげ〜」って思ったものを備忘録的にいくつか書いておきます。

sortBy() / sortByDesc()

例えば、こんな構造のCollectionがあったとする。

$collection = [
    {
        id: 1,
        children: {
            id: 3
        }
    },
    {
        id: 2,
        children: {
            id: 2
        }
    },
    {
        id: 3,
        children: {
            id: 1
        }
    }
]

※ 配列の書き方は適当です。

これを、こうできる

$collection->sortBy(function($it){
    return $it['children']->id;
});
[
    {
        id: 3,
        children: {
            id: 1
        }
    },
    {
        id: 2,
        children: {
            id: 2
        }
    },
    {
        id: 1,
        children: {
            id: 3
        }
    }
]

与えたコールバックがreturnした値によって並び替え処理が行われる。
確実に値さえ返せればソートが行われるので、ネストされているものがオブジェクトだろうがなんだろうが関係ない。すごい。

groupBy()

コールバックが返す値が同じものをグルーピングしてくれる。

$collection = [
    {
        date: new Carbon('2020-03-09')
    },
    {
        date: new Carbon('2020-02-10')
    },
    {
        date: new Carbon('2020-01-11')
    },
    {
        date: new Carbon('2019-12-12')
    },
    {
        date: new Carbon('2019-11-13')
    },
    {
        date: new Carbon('2019-10-14')
    },
]
$collection->groupBy(function($it){
    return $it->date->year;
});
{
    2020: [
        {
            date: new Carbon('2020-03-09')
        },
        {
            date: new Carbon('2020-02-10')
        },
        {
            date: new Carbon('2020-01-11')
        },
    ],
    2019: [
        {
            date: new Carbon('2019-12-12')
        },
        {
            date: new Carbon('2019-11-13')
        },
        {
            date: new Carbon('2019-10-14')
        },
    ]
}

キーにはグループで共通の値になるのもとっても良い...!

avg()

返した値の平均が取れるので、Carbonを使う時とかも便利だった。

$collection = [
    {
        date: new Carbon('2020-03-09')
    },
    {
        date: new Carbon('2020-03-10')
    },
    {
        date: new Carbon('2020-03-11')
    },
    {
        date: new Carbon('2020-03-12')
    },
    {
        date: new Carbon('2020-03-13')
    }
]
$avg = $collection->avg(function($it){
    return $it->date->timestamp;
});

var_dump(Carbon::createFromTimestamp($avg));
// 2020-03-11 ぐらいになる

Laravelで配列を使うならCollectionを使いまくろう!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away