LoginSignup
0
0

More than 3 years have passed since last update.

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

Posted at

コレクション 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を使いまくろう!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0