【Laravel】 Laravel 5.7コレクション を一気に勉強(8) − isNotEmpty,keyBy,keys,last,macro




isNotEmpty()

コレクションが空でない場合true、空の場合はfalseを返します。

dump(collect(['a' => 1])->isNotEmpty());
dump(collect([])->isNotEmpty());
/*
true
false
*/

keyBy()

指定したパラメーターをキーにしたコレクションを返します。

$collection = collect([
    ['name' => 'ichiro', 'no' => 51, 'team' => 'B'],
    ['name' => 'ichiro', 'no' => 31, 'team' => 'NY'],
    ['name' => 'matsui', 'no' => 55, 'team' => 'G'],
    ['name' => 'senichi', 'no' => 77, 'team' => 'D'],
]);
dump($collection->keyBy('name'));
/*
Collection {#424 ▼
  #items: array:3 [▼
    "ichiro" => array:3 [▼
      "name" => "ichiro"
      "no" => 31
      "team" => "NY"
    ]
    "matsui" => array:3 [▼
      "name" => "matsui"
      "no" => 55
      "team" => "G"
    ]
    "senichi" => array:3 [▼
      "name" => "senichi"
      "no" => 77
      "team" => "D"
    ]
  ]
}
*/

パラメーターにコールバックを指定すると、コールバックの結果をキーにしたコレクションを生成します。

dump($collection->keyBy(function($item) {
    return strtoupper($item['name']);
}));
/*
Collection {#425 ▼
  #items: array:3 [▼
    "ICHIRO" => array:3 [▼
      "name" => "ichiro"
      "no" => 31
      "team" => "NY"
    ]
    "MATSUI" => array:3 [▼
      "name" => "matsui"
      "no" => 55
      "team" => "G"
    ]
    "SENICHI" => array:3 [▼
      "name" => "senichi"
      "no" => 77
      "team" => "D"
    ]
  ]
}
*/

keys()

コレクションのキーリストを返します。

$collection = collect(['name' => 'ichiro', 'no' => 51, 'team' => 'B']);
dump($collection->keys());
/*
Collection {#422 ▼
  #items: array:3 [▼
    0 => "name"
    1 => "no"
    2 => "team"
  ]
}
*/

last()

コールバックで指定した条件に一致する最後の値を返します。
コールバックを指定しない場合はコレクションの最後の値を返します。

dump(collect($array)->last(function($value, $key) {
    return $value >= 18;
}));
dump(collect($array)->last());
/*
19
19
*/

macro()

macroメソッドを使って新しいメソッドを追加することができます。

$array = [];
for($i = 0; $i < 20; $i++) {
    $array[] = $i;
}
Collection::macro('over3', function() {
    return $this->filter(function($value) {
        return $value >= 3 ? $value : null;
    });
});
dump(collect($array)->over3()->all());
/*
array:17 [▼
  3 => 3
  4 => 4
  5 => 5
  6 => 6
  7 => 7
  8 => 8
  9 => 9
  10 => 10
  11 => 11
  12 => 12
  13 => 13
  14 => 14
  15 => 15
  16 => 16
  17 => 17
  18 => 18
  19 => 19
]
*/