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