配列やコレクションなどの集合体から、特定の条件でデータを抽出したり、中身を別の型のコレクションに移し替えたり、合計値を求める時など、コレクションに対する操作を for 構文などの繰り返しを使わない形で値の集合を操作する事が出来ます。
今回はその中でもよく利用する機能を一覧に纏めました。
よく使う コレクション操作の一覧
使用するサンプルデータ
$userList = collect([
["id"=>1, "team"=>"teamA", "score"=>30],
["id"=>2, "team"=>"teamB", "score"=>50],
["id"=>3, "team"=>"teamA", "score"=>10],
["id"=>4, "team"=>"teamB", "score"=>40]
]);
each
each は、要素を1つずつ取り出し何らかの処理をするメソッドです。
$userList->each(function($e) {
Log::debug(print_r($e));
});
// user1 user2 user3 user4
filter
filter は、引数で指定した条件に一致する要素を抽出するメソッドです。
$userList = $userList->filter(function($e) {
return "teamB" === $e["team"];
})->values();
Log::debug(print_r($userList));
// user2 user4
map
map は、リスト の要素を別の型に変換するメソッドです。
$userIdList = $userList->map(function($e) {
return $e["id"];
})->toArray();
Log::debug(print_r($userIdList));
// 1 2 3 4
flatMap
flatMapは、mapと同じく リスト の要素を別の型に変換するメソッドです。map が1対1で要素の型を変換するのに対し、flatMap は1対多で変換をします。
つまり、入力した要素の中にある配列をフラットにして新しい配列を作成するときなどに flatMap を使用します。
$userList = collect([
["id"=>1, 'favorite' => ['java', 'php']],
["id"=>2, 'favorite' => ['javascript', 'ruby']],
["id"=>3, 'favorite' => ['python', 'java']],
["id"=>4, 'favorite' => ['javascript', 'typescript']]
]);
$userIdList = $userList->flatMap(function($e) {
return $e['favorite'];
})->toArray();
Log::debug(print_r($userIdList));
// ["java", "php", "javascript", "ruby", "python", "java", "javascript", "typescript"]
unique
unique は、リスト の要素の中で、値もしくわ指定したキーが重複している要素を取り除くメソッドです。
$userList = $userList->map(function($e) {
return $e["team"];
})->unique()->toArray();
Log::debug(print_r($userList));
// teamA teamB
sortBy
sortByは、リスト の要素を並び替えるメソッドです。
$userList = $userList->sortBy("score")->toArray();
Log::debug(print_r($userList));
// user2 user4 user1 user3
slice
sliceは、リスト の先頭から指定した位置までを取り出すメソッドです。
$userList = $userList->slice(0, 3)->toArray();
Log::debug(print_r($userList));
// user1 user2 user3
splice
spliceは、リスト の指定した位置から最後までを取り出すメソッドです。
$userList = $userList->splice(1)->toArray();
Log::debug(print_r($userList));
// user2 user3 user4
mapWithKeys
mapWithKeysは、リストを Map クラスに変換します。
$userMap = $userList->mapWithKeys(function($e) {
return [$e['id'] => $e];
})->toArray();
Log::debug(print_r($userMap));
// {1=user1 , 2=user2 , 3=user3 , 4=user4 }
groupBy
groupByは、リストを グループごとに分別します。
$userMap = $userList->groupBy("team")->toArray();
Log::debug(print_r($userMap));
// {teamA=[user1 , user3 ], teamB=[user2 , user4 ]}
count
count は、リスト の件数を取得するメソッドです。
$value = $userList->count();
Log::debug(print_r($value));
// 4
max / min
max / min は、リスト の最大値 / 最小値 を取得するメソッドです。
$value = $userList->max("score");
Log::debug(print_r($value));
// 50
$value = $userList->min("score");
Log::debug(print_r($value));
// 10
sum
sum は、リスト の合計値を取得するメソッドです。
$value = $userList->sum("score");
Log::debug(print_r($value));
// 130
average
average は、リスト の平均値を取得するメソッドです。
$value = $userList->average("score");
Log::debug(print_r($value));
// 32.5