Метод flatMap
Метод flatMap применяется к коллекции и принимает в качестве
параметра функцию обратного вызова. Эта функция выполняется для
каждого элемента коллекции и должна возвращать массив или коллекцию.
Результаты всех вызовов затем объединяются в одну коллекцию (то есть
происходит выравнивание на один уровень). Метод удобен в ситуациях,
когда нужно одновременно преобразовать данные и избавиться от
вложенности.
Синтаксис
<?php
$collection = collect($array);
$res = $collection->flatMap(function ($item) {
return $result;
});
?>
Пример
Давайте преобразуем массив чисел, вернув для каждого элемента массив из самого числа и его квадрата:
<?php
$collection = collect([1, 2, 3, 4, 5]);
$res = $collection->flatMap(function ($item) {
return [$item, $item * $item];
});
echo json_encode($res->toArray());
?>
Результат выполнения кода:
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25]
Пример
Давайте обработаем коллекцию пользователей и вернём для каждого список его постов:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class User extends Model
{
protected $fillable = ['name', 'email'];
public function posts()
{
return $this->hasMany(Post::class);
}
}
?>
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Post extends Model
{
protected $fillable = ['title', 'content', 'user_id'];
}
?>
<?php
namespace AppHttpControllers;
use AppModelsUser;
use IlluminateSupportCollection;
class UserController extends Controller
{
public function index()
{
$users = User::with('posts')->get();
$res = $users->flatMap(function ($user) {
return $user->posts;
});
echo json_encode($res->pluck('title')->toArray());
}
}
?>
Результат выполнения кода:
["Post 1", "Post 2", "Post 3", "Post 4", "Post 5"]
Пример
Давайте сгруппируем элементы по категориям и выровняем результат:
<?php
$collection = collect([
['category' => 'a', 'value' => 1],
['category' => 'a', 'value' => 2],
['category' => 'b', 'value' => 3],
['category' => 'b', 'value' => 4],
['category' => 'c', 'value' => 5],
]);
$res = $collection->groupBy('category')
->flatMap(function ($group) {
return $group->map(function ($item) {
return $item['value'] * 2;
});
});
echo json_encode($res->values()->toArray());
?>
Результат выполнения кода:
[2, 4, 6, 8, 10]
Пример
Давайте создадим коллекцию из пар ключ-значение и выровняем её:
<?php
$collection = collect([
['key1' => 'a', 'key2' => 'b'],
['key3' => 'c', 'key4' => 'd'],
]);
$res = $collection->flatMap(function ($item) {
return array_values($item);
});
echo json_encode($res->toArray());
?>
Результат выполнения кода:
["a", "b", "c", "d"]
Пример
Давайте используем flatMap для обработки вложенных коллекций:
<?php
$collection = collect([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]);
$res = $collection->flatMap(function ($row) {
return $row;
});
echo json_encode($res->toArray());
?>
Результат выполнения кода:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Смотрите также
-
метод
map,
который применяет функцию к каждому элементу -
метод
flatten,
который выравнивает многомерную коллекцию -
метод
collapse,
который объединяет массив коллекций в одну -
метод
mapWithKeys,
который преобразует элементы в пары ключ-значение