Skip to content

Feature Slice

github-actions[bot] edited this page Jul 16, 2026 · 1 revision

✂️ Срезы и группировка

← Возможности · Главная · Сравнение

Разбиение коллекции на части: slice/take*/skip*/nth, chunk/split/partition, groupBy/keyBy/countBy.

Принцип работы

chunk/split/partition/groupBy возвращают коллекции полноценных вложенных коллекций — к каждой группе сразу применима вся цепочка методов. groupBy/keyBy/ countBy принимают имя поля (извлечение через dataGet: массивы и объекты) либо callback.

use CloudCastle\Collection\Collection;

$c = Collection::make([1, 2, 3, 4, 5]);

$c->take(2);        // [1, 2]
$c->take(-2);       // [4, 5]
$c->skipWhile(fn ($v) => $v < 3); // [3, 4, 5]
$c->nth(2);         // [1, 3, 5]
$c->chunk(2);       // [[1, 2], [3, 4], [5]] — каждая часть Collection
$c->split(4);       // ceil(5/4)=2 → группы 2+2+1

[$even, $odd] = $c->partition(fn ($v) => $v % 2 === 0)->all();

$orders = Collection::make([
    ['status' => 'paid', 'total' => 150],
    ['status' => 'pending', 'total' => 70],
    ['status' => 'paid', 'total' => 220],
]);

$orders->groupBy('status');   // ['paid' => Collection(2), 'pending' => Collection(1)]
$orders->keyBy('status');     // последний с тем же ключом выигрывает
$orders->countBy(fn ($o) => $o['status']); // ['paid' => 2, 'pending' => 1]

Плюсы

  • Вложенные коллекции: groupBy('x')->map(fn ($g) => $g->sum('y')) — без ручных циклов.
  • groupBy по полю — быстрейший среди аналогов (см. Сравнение).
  • split делит на равные группы через ceil — без пустых хвостов.

Минусы

  • Обёртка каждой группы в коллекцию дороже сырых массивов: chunk у aimeos/map быстрее в ~2× именно потому, что не оборачивает. Это осознанный размен на богатство API.

✅ Рекомендуется

  • Отчёты «агрегат по группе» — через groupBy(...)->map(fn ($g) => $g->sum(...)).
  • Пагинацию больших выборок — через chunk(N) c обработкой частей.
  • keyBy('id') для O(1)-доступа по идентификатору вместо повторных firstWhere.

❌ Антипаттерны

  • chunk для потоковой обработки миллионов строк из БД — читайте курсором из источника, коллекция держит все элементы в памяти.
  • Ручное foreach + $groups[$k][] = … вместо groupBy — теряете цепочку и читаемость.

Clone this wiki locally