Метод partition
Метод partition применяется к объекту коллекции
и возвращает массив из двух коллекций. Первым параметром
передаётся замыкание, которое для каждого элемента возвращает
true или false. Если условие выполняется,
элемент попадает в первую коллекцию, иначе - во вторую.
Метод полезен для разделения данных на две группы по
определённому признаку.
Синтаксис
<?php
$collection = collect([1, 2, 3, 4, 5]);
[$trueCollection, $falseCollection] = $collection->partition(function($value) {
return $value > 3;
});
?>
Пример
Давайте разделим массив чисел на чётные и нечётные:
<?php
use Illuminate\Support\Collection;
$numbers = [1, 2, 3, 4, 5];
$collection = collect($numbers);
[$even, $odd] = $collection->partition(function($value) {
return $value % 2 === 0;
});
echo "Чётные числа: " . implode(', ', $even->all());
echo "Нечётные числа: " . implode(', ', $odd->all());
?>
Результат выполнения кода:
"Чётные числа: 2, 4"
"Нечётные числа: 1, 3, 5"
Пример
Разделим коллекцию строк по длине слова:
<?php
use Illuminate\Support\Collection;
$words = ['abcde', 'user', 'category', 'article'];
$collection = collect($words);
[$longWords, $shortWords] = $collection->partition(function($value) {
return strlen($value) > 5;
});
echo "Длинные слова (> 5 символов): " . implode(', ', $longWords->all());
echo "Короткие слова (<= 5 символов): " . implode(', ', $shortWords->all());
?>
Результат выполнения кода:
"Длинные слова (> 5 символов): category, article"
"Короткие слова (<= 5 символов): abcde, user"
Пример
Разделим коллекцию объектов на активные и неактивные записи:
<?php
use Illuminate\Support\Collection;
$users = [
['name' => 'John', 'active' => true],
['name' => 'Jane', 'active' => false],
['name' => 'Bob', 'active' => true],
['name' => 'Alice', 'active' => false]
];
$collection = collect($users);
[$activeUsers, $inactiveUsers] = $collection->partition(function($user) {
return $user['active'] === true;
});
echo "Активные пользователи: " . implode(', ', $activeUsers->pluck('name')->all());
echo "Неактивные пользователи: " . implode(', ', $inactiveUsers->pluck('name')->all());
?>
Результат выполнения кода:
"Активные пользователи: John, Bob"
"Неактивные пользователи: Jane, Alice"