1. Denpa_Ghost

    Posted

    Denpa_Ghost
Changes in title
+Laravel Collectionのメソッドの引数にcallbackを与えてパワフルに使う
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,161 @@
+[コレクション 5.8 Laravel](https://readouble.com/laravel/5.8/ja/collections.html#method-splice) のメソッドの解説では省かれてしまっているけど、コレクションの持つ多くのメソッドは引数に`callable`を受け取ることができる。
+
+自分で実際に使って「しゅげ〜」って思ったものを備忘録的にいくつか書いておきます。
+
+# `sortBy()` / `sortByDesc()`
+例えば、こんな構造のCollectionがあったとする。
+
+```
+$collection = [
+ {
+ id: 1,
+ children: {
+ id: 3
+ }
+ },
+ {
+ id: 2,
+ children: {
+ id: 2
+ }
+ },
+ {
+ id: 3,
+ children: {
+ id: 1
+ }
+ }
+]
+```
+※ 配列の書き方は適当です。
+
+これを、こうできる
+
+```php
+$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')
+ },
+]
+```
+
+```php
+$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')
+ }
+]
+```
+
+```php
+$avg = $collection->avg(function($it){
+ return $it->date->timestamp;
+});
+
+var_dump(Carbon::createFromTimestamp($avg));
+// 2020-03-11 ぐらいになる
+```
+
+---
+
+Laravelで配列を使うならCollectionを使いまくろう!