Метод groupBy
Метод groupBy применяется к коллекции и группирует её элементы по указанному ключу или результату callback-функции. Этот метод часто используется для агрегации данных, полученных из базы данных, или для организации данных в структурированном виде. В качестве первого параметра передаётся ключ для группировки или callback-функция, которая определяет критерий группировки.
Синтаксис
<?php
$collection->groupBy($key);
$collection->groupBy(callable $callback);
?>
Пример
Давайте сгруппируем массив пользователей по их статусу:
<?php
use Illuminate\Support\Collection;
$users = new Collection([
['name' => 'John', 'status' => 'active'],
['name' => 'Jane', 'status' => 'inactive'],
['name' => 'Bob', 'status' => 'active'],
['name' => 'Alice', 'status' => 'pending'],
['name' => 'Tom', 'status' => 'inactive']
]);
$res = $users->groupBy('status');
foreach ($res as $status => $users) {
echo "Status: $status" . PHP_EOL;
foreach ($users as $user) {
echo " - " . $user['name'] . PHP_EOL;
}
}
?>
Результат выполнения кода:
"Status: active"
" - John"
" - Bob"
"Status: inactive"
" - Jane"
" - Tom"
"Status: pending"
" - Alice"
Пример
Давайте сгруппируем числа по их чётности:
<?php
use Illuminate\Support\Collection;
$collection = new Collection([1, 2, 3, 4, 5, 6, 7, 8, 9]);
$res = $collection->groupBy(function ($item) {
return $item % 2 == 0 ? 'even' : 'odd';
});
foreach ($res as $type => $items) {
echo $type . ': ' . implode(', ', $items->toArray()) . PHP_EOL;
}
?>
Результат выполнения кода:
"odd: 1, 3, 5, 7, 9"
"even: 2, 4, 6, 8"
Пример
Сгруппируем записи из базы данных по категориям с использованием Eloquent:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use Illuminate\Http\Request;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::all();
$res = $articles->groupBy('category');
foreach ($res as $category => $items) {
echo "Category: $category" . PHP_EOL;
foreach ($items as $article) {
echo " - " . $article->title . PHP_EOL;
}
}
}
}
?>
Результат выполнения кода:
"Category: Technology"
" - Laravel 11 Features"
" - PHP 8.3 Best Practices"
"Category: Design"
" - UX Design Principles"
" - Color Theory Guide"
Пример
Используем группировку с преобразованием данных с помощью метода map:
<?php
use Illuminate\Support\Collection;
$orders = new Collection([
['id' => 1, 'customer' => 'John', 'amount' => 100],
['id' => 2, 'customer' => 'Jane', 'amount' => 200],
['id' => 3, 'customer' => 'John', 'amount' => 150],
['id' => 4, 'customer' => 'Bob', 'amount' => 300],
['id' => 5, 'customer' => 'Jane', 'amount' => 250]
]);
$res = $orders->groupBy('customer')
->map(function ($items) {
return $items->sum('amount');
});
foreach ($res as $customer => $total) {
echo "$customer: $$total" . PHP_EOL;
}
?>
Результат выполнения кода:
"John: $250"
"Jane: $450"
"Bob: $300"
Пример
Группировка по вложенному свойству с помощью точечной нотации:
<?php
use Illuminate\Support\Collection;
$data = new Collection([
['user' => ['name' => 'John', 'city' => 'NYC'], 'score' => 90],
['user' => ['name' => 'Jane', 'city' => 'LA'], 'score' => 85],
['user' => ['name' => 'Bob', 'city' => 'NYC'], 'score' => 95],
['user' => ['name' => 'Alice', 'city' => 'LA'], 'score' => 88]
]);
$res = $data->groupBy('user.city');
foreach ($res as $city => $items) {
echo "City: $city" . PHP_EOL;
foreach ($items as $item) {
echo " - " . $item['user']['name'] . ' (score: ' . $item['score'] . ')' . PHP_EOL;
}
}
?>
Результат выполнения кода:
"City: NYC"
" - John (score: 90)"
" - Bob (score: 95)"
"City: LA"
" - Jane (score: 85)"
" - Alice (score: 88)"