Перетворити один зі списків на «словник» за ключем - тоді пошук стає миттєвим.
// 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, файл імпорту, інша база.