Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Tips 14 вересня 2026

collapse() - Сплющення вкладених колекцій

Маєте масив масивів? Потрібен один суцільний?

collapse() сплющує лише один рівень.

Приклади використання:

  • Об'єднання кількох колекцій
  • Сплющення згрупованих даних
  • Комбінування результатів запитів

Відмінність від flatten():

  • collapse() - один рівень
  • flatten() - рекурсивно всі рівні

Порада: використовуйте flatten() для глибоко вкладених структур.

// Масив масивів
$data = collect([
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
]);

$flat = $data->collapse();
// [1, 2, 3, 4, 5, 6, 7, 8, 9]

// Колекції у колекції
$tags = collect([
  collect(['php', 'laravel']),
  collect(['javascript', 'vue']),
  collect(['mysql', 'redis']),
]);

$allTags = $tags->collapse();
// ['php', 'laravel', 'javascript', 'vue', 'mysql', 'redis']

// Приклад: об'єднання дозволів користувача з ролей
$user->roles->map(fn($role) => $role->permissions)->collapse();

// Групування, а потім collapse
$orders = Order::all()
  ->groupBy('user_id')
  ->map(fn($userOrders) => $userOrders->pluck('items'))
  ->collapse();
// Відмінність collapse vs flatten
$nested = collect([
  [1, [2, [3, 4]]],
  [5, [6, [7, 8]]],
]);

$nested->collapse(); // [1, [2, [3, 4]], 5, [6, [7, 8]]]
$nested->flatten();  // [1, 2, 3, 4, 5, 6, 7, 8]

// Об'єднання масивів із кількох моделей
$allEmails = collect([$users, $admins, $moderators])
  ->map(fn($group) => $group->pluck('email'))
  ->collapse()
  ->unique();

// Теги з постів
$uniqueTags = Post::with('tags')->get()
  ->map(fn($p) => $p->tags)
  ->collapse()
  ->unique('id');

// Комбінування результатів пошуку
$results = collect([$localResults, $apiResults])
  ->collapse()
  ->sortByDesc('relevance');

Читати в документації

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Інші поради

Tips 18 вересня 2026

skip() і take() - пагінація без БД

Потрібна пагінація на клієнтській стороні або на вже завантажених даних?

skip() і take() працюють як OFFSET і LIMIT.

Використання:

  • In-memory пагінація
  • Розбиття результатів
  • API-слайси

Комбінація:

Використовуються разом.

Порада: forPage() - короткий шлях для skip/take.

$items = collect(range(1, 100));

// Пропустити 20, взяти 10
$page = $items->skip(20)->take(10);
// [21, 22, ..., 30]

// Пагінація вручну
$perPage = 10;
$page = 3;

$results = $items->skip(($page - 1) * $perPage)
  ->take($perPage);

// Коротко: forPage()
$results = $items->forPage(3, 10);

// Умовні варіанти замість числа
$items->skipUntil(fn($i) => $i > 50);
$items->skipWhile(fn($i) => $i < 20);
$items->takeUntil(fn($i) => $i > 50);
$items->takeWhile(fn($i) => $i < 20);
Tips 16 вересня 2026

sliding() - Створення "ковзних вікон"

Потрібні перекривні чанки? Наприклад, для ковзного середнього?

sliding() створює ковзні вікна по колекції.

Використання:

  • Ковзні середні
  • Аналіз трендів
  • Пошук патернів
  • Послідовний аналіз

Параметри:

  • Розмір вікна
  • Крок (за замовчуванням 1)

Порада: підходить для аналізу часових рядів.

$numbers = collect([1, 2, 3, 4, 5, 6]);

// Розмір 3, крок 1
$windows = $numbers->sliding(3);
// [[1,2,3], [2,3,4], [3,4,5], [4,5,6]]

// Розмір 3, крок 2
$windows = $numbers->sliding(3, 2);
// [[1,2,3], [3,4,5]]

// Ковзне середнє
$values = collect([10, 20, 30, 40, 50]);

$movingAvg = $values->sliding(3)
  ->map(fn($window) => $window->avg());
// [20, 30, 40]
Tips 11 вересня 2026

sortBy() з кількома колонками

Потрібно сортувати за кількома полями? Подібно до ORDER BY у SQL.

sortBy() приймає масив пар "колонка/напрям".

Синтаксис:

Масив масивів: [column, direction].

Напрям:

asc або desc.

Порада: використовуйте sortByDesc() для одного поля зі спаданням.

$users = collect([
  ['name' => 'John', 'age' => 30, 'city' => 'NYC'],
  ['name' => 'Jane', 'age' => 25, 'city' => 'LA'],
  ['name' => 'Bob', 'age' => 30, 'city' => 'SF'],
]);

// Сортування за віком, потім за ім'ям
$sorted = $users->sortBy([
  ['age', 'asc'],
  ['name', 'asc'],
]);

// За містом спаданням, далі за віком
$sorted = $users->sortBy([
  ['city', 'desc'],
  ['age', 'asc'],
]);

// З callback
$sorted = $users->sortBy([
  [fn($user) => $user['age'], 'desc'],
  ['name', 'asc'],
]);

// Еloquent-колекції
$posts = Post::all()->sortBy([
  ['featured', 'desc'],
  ['published_at', 'desc'],
]);
Tips 09 вересня 2026

whenEmpty() та whenNotEmpty() - умовні операції

Потрібно виконувати код лише тоді, коли колекція порожня або непорожня? if/else роблять код об'ємним.

whenEmpty() та whenNotEmpty() роблять це чисто.

Приклади використання:

  • Показати контент за замовчуванням
  • Логувати попередження
  • Запускати fallback-логіку
  • Присвоювати значення за замовчуванням

Перевага:

Методи ланцюжаться та зберігають fluent-синтаксис.

Порада: значення, повернуте з callback, стає новим значенням колекції.

10
$users = User::where('active', true)->get();

// ПОГАНО: розривається ланцюжок
if ($users->isEmpty()) {
  return redirect()->back()->with('error', 'No active users');
}

// ДОБРЕ: fluent-синтаксис
$users->whenEmpty(function () {
  return redirect()->back()->with('error', 'No active users');
});

// Додати елементи за замовчуванням, якщо порожньо
$products = Product::where('featured', true)->get();

$products = $products->whenEmpty(function ($collection) {
  return Product::latest()->limit(5)->get();
});

// Логування, якщо непорожня
$errors->whenNotEmpty(function ($collection) {
  Log::error('Validation errors found', $collection->toArray());
});

// З "else"
$users->whenEmpty(
  fn($collection) => ['name' => 'Guest'],
  fn($collection) => $collection->first()
);
Tips 07 вересня 2026

firstWhere() - Пошук елемента за атрибутом

Потрібно знайти перший елемент, що відповідає умові?

firstWhere() виглядає чистіше, ніж filter()->first().

Переваги:

  • Один метод замість двох
  • Автоматична обробка null
  • Підтримує оператори

Оператори:

Такі ж, як у where(): =, !=, >, <, >=, <=

Порада: використовуйте другий параметр для значення за замовчуванням, якщо елемент не знайдено.

3
$users = collect([
  ['id' => 1, 'name' => 'John', 'age' => 25],
  ['id' => 2, 'name' => 'Jane', 'age' => 30],
  ['id' => 3, 'name' => 'Bob', 'age' => 35],
]);

// ПОГАНО: два методи
$user = $users->filter(fn($u) => $u['age'] > 30)->first();

// ДОБРЕ: один метод
$user = $users->firstWhere('age', '>', 30);
// ['id' => 3, 'name' => 'Bob', 'age' => 35]

// Точна відповідність (оператор за замовчуванням - =)
$user = $users->firstWhere('name', 'Jane');

// Із значенням за замовчуванням
$guest = ['name' => 'Guest'];
$user = $users->firstWhere('age', '>', 100) ?? $guest;

// Eloquent-колекції
$featured = Post::all()->firstWhere('featured', true);

// Кілька умов - first із callback
$user = $users->first(
  fn($u) => $u['age'] > 30 && $u['name'] !== 'Bob'
);
Завантаження...