【Laravel】 Laravel 5.7コレクション を一気に勉強(5) − filter,first,firstWhere,flatMap,flatten




この記事は最終更新日から2年以上経過しています。

filter()

指定した条件に一致する値のみ抽出したコレクションを返します。
逆の動作はreject()で実現できます。

$collection = collect([1, 2, 3, 4]);
dump($collection->filter(function ($value, $key) {
    return $value > 2;
}));
/*
Collection {#415 ▼
  #items: array:2 [▼
    2 => 3
    3 => 4
  ]
}
*/

first()

条件に一致する最初の要素を返します。
条件が指定されない場合は最初の要素が返されます。

$collection = collect([1, 2, 3, 4]);
dump($collection->first(function($value, $key) {
    return $value >= 2;
}));
// 2
dump($collection->first());
// 1

firstWhere()

指定したキーの値が条件に一致する最初の配列を返します。

$collection = collect([
    ['name' => 'ichiro', 'no' => 51, 'team' => 'B'],
    ['name' => 'matsui', 'no' => 55, 'team' => 'G'],
    ['name' => 'senichi', 'no' => 77, 'team' => 'D'],
]);
dump($collection->firstWhere('no', 77));
/*
array:3 [▼
  "name" => "senichi"
  "no" => 77
  "team" => "D"
]
*/

flatMap()

コレクションの値をコールバックに渡します。
コールバックの戻り値を値とした新しいコレクションを生成するので、コールバック中で値の操作をすることができます。

$collection = collect([
    ['name' => 'ichiro'],
    ['no' => 51],
    ['team' => 'B']
]);
$collection2 = $collection->flatMap(function($values) {
    return collect($values)->keys()->map(function($key) use($values) {
        return $key .  ':' . $values[$key];
    });
});
dump($collection2);
/*
Collection {#424 ▼
  #items: array:3 [▼
    0 => "name:ichiro"
    1 => "no:51"
    2 => "team:B"
  ]
}
*/

flatten()

ネストしているコレクションを一元化します。
パラメーターを指定することにより指定した階層までを一元化することもできます。

$collection = collect([
    ['name' => 'ichiro', 'no' => 51, 'team' => 'B', ['b11', 'b22',]],
    ['name' => 'matsui', 'no' => 55, 'team' => 'G', ['g11', 'g22',]],
    ['name' => 'senichi', 'no' => 77, 'team' => 'D', ['d11', 'd22',]],
]);
dump($collection->flatten());
/*
Collection {#415 ▼
  #items: array:15 [▼
    0 => "ichiro"
    1 => 51
    2 => "B"
    3 => "b11"
    4 => "b22"
    5 => "matsui"
    6 => 55
    7 => "G"
    8 => "g11"
    9 => "g22"
    10 => "senichi"
    11 => 77
    12 => "D"
    13 => "d11"
    14 => "d22"
  ]
}
*/

dump($collection->flatten(1));
/*
Collection {#419 ▼
  #items: array:12 [▼
    0 => "ichiro"
    1 => 51
    2 => "B"
    3 => array:2 [▼
      0 => "b11"
      1 => "b22"
    ]
    4 => "matsui"
    5 => 55
    6 => "G"
    7 => array:2 [▶]
    8 => "senichi"
    9 => 77
    10 => "D"
    11 => array:2 [▶]
  ]
}
*/