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

Як прибрати вкладені цикли при зіставленні двох списків?

Перетворити один зі списків на «словник» за ключем - тоді пошук стає миттєвим.

// O(n × m): для кожного замовлення шукаємо клієнта перебором
foreach ($orders as $order) {
    $customer = $customers->firstWhere('id', $order->customer_id);
}

// O(n + m): один раз будуємо індекс
$customersById = $customers->keyBy('id');

foreach ($orders as $order) {
    $customer = $customersById[$order->customer_id] ?? null;
}

На 5000 замовлень і 5000 клієнтів перший варіант - до 25 мільйонів порівнянь, другий - 10 тисяч операцій.

Інструменти:

  • keyBy('id') - один елемент на ключ;
  • groupBy('customer_id') - кілька елементів на ключ (усі замовлення клієнта);
  • mapWithKeys() - довільні пари ключ-значення;
  • pluck('name', 'id') - словник «id => назва» для випадаючих списків.

Але спершу питання: чи потрібно зіставляти в PHP? Якщо обидва списки з однієї бази, зв'язок з with() чи join зробить це ефективніше й без завантаження зайвого. keyBy() - для даних з різних джерел: API, файл імпорту, інша база.

Докладніше в документації: Метод keyBy

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання