Skip to content

Feature Transform

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

🔁 Трансформация и фильтрация

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

Создание новых коллекций из существующих: map/mapWithKeys/flatMap/pluck, filter/reject, всё where-семейство, типобезопасные unique/duplicates, flatten/collapse/pad/reverse/shuffle.

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

Все трансформации иммутабельны — исходная коллекция не меняется. Замыкания без параметра ключа автоматически уходят в C-реализации (array_map/array_filter) — арность определяется рефлексией с кэшем на WeakMap. Выборка поля (pluck) идёт через array_column с точным fallback для отсутствующих полей.

use CloudCastle\Collection\Collection;

$rows = Collection::make([
    ['id' => 1, 'age' => 10, 'tag' => null],
    ['id' => 2, 'age' => 20, 'tag' => 'x'],
]);

$rows->pluck('id');                    // [1, 2] — через array_column
$rows->pluck('tag', 'id');             // [1 => null, 2 => 'x']
$rows->where('id', 2);                 // строгое сравнение
$rows->where('id', '2');               // пусто: '2' ≠ 2
$rows->whereBetween('age', [10, 20]);  // границы включительно
$rows->whereNull('tag');               // [['id' => 1, …]]

// Типобезопасный unique: 1, '1' и true — разные значения
Collection::make([1, '1', true])->unique()->count(); // 3

// Строковый callable получает только значение — без ловушки intval
Collection::make(['1', '2'])->map('intval'); // [1, 2] (а не [1, 0], как в аналогах)
Collection::make([1, 'a', 3])->filter('is_int'); // [1, 3] — без ArgumentCountError

// Замыкание с ключом — общий путь
$rows->map(fn ($item, $key) => $key . ':' . $item['id']);

Плюсы

  • unique/duplicates различают типы через раздельные реестры — без хэш-коллизий и с полной точностью float (0.30.1 + 0.2).
  • map('intval') безопасен: у аналогов ключ попадает в параметр базы системы счисления.
  • Fast-path даёт скорость C-циклов там, где ключ не нужен, — без изменения семантики.
  • pluck по полю в разы быстрее ручного map: C-реализация array_column.

Минусы

  • Callback-объекты с __invoke(mixed $v) (без второго параметра) в filter идут через ARRAY_FILTER_USE_BOTH — объявляйте второй параметр или используйте замыкание.

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

  • Для выборки поля использовать pluck('field'), а не map(fn ($r) => $r['field']).
  • Встроенные функции передавать строкой: map('trim'), filter('is_string').
  • Фильтровать по полю через where-семейство — читаемее и быстрее ручных замыканий.

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

  • unique() для «очистки» пользовательского ввода разных типов с ожиданием loose-семантики — здесь 1 и '1' намеренно различны.
  • Цепочка values()->all()[0] вместо first().

Clone this wiki locally