Часто нам потрібно об'єднати декілька масивів разом, це можна зробити дуже елегантно за допомогою функції `array_merge`:
$userIdsA = [1, 2, 3];$userIdsB = [5, 6, 7];// повертає [1, 2, 3, 5, 6, 7]$finalIds = array_merge($userIdsA, $userIdsB);
Функція array_merge
об'єднує два масиви в один великий масив. Якщо відбувається колізія ключів, то перемагає значення крайнього правого масиву.
Однак, часто ми отримуємо масив масивів, який створюється тільки в циклі (наприклад, з бази даних, а потім пропускається через foreach), і тому ми не знаємо наперед кількість злиттів.
Наївне рішення могло б виглядати так:
$finalIds = [];foreach ($users as $user) {$finalIds = array_merge($finalIds, $user->someIds);}
Однак це рішення є дуже неефективним, оскільки ми повинні об'єднувати масиви разом з кожною ітерацією та ітерації по всьому великому масиву.
Однак є просте рішення, коли ми модифікуємо алгоритм злиття, щоб він проходив через дані лише один раз:
$finalIds = [];foreach ($users as $user) {$finalIds[] = $user->someIds;}
У цьому випадку поле $finalIds
буде генерувати трохи більше даних, але це все одно є меншою проблемою, ніж перевага в економії часу.
Саме об'єднання залежить від версії PHP, яку ви використовуєте, і вирішується за допомогою елегантного трюку:
/* PHP 5.6 і старше */ </ span> </ span> */ </ span> PHP 5.6 і старше$finalIds = call_user_func_array('array_merge', $finalIds + [[]]);/* PHP 5.6+ та новіші версії */$finalIds = array_merge([], ...$finalIds);/* PHP 7.4+ і новіше для непорожніх полів */$finalIds = array_merge(...$finalIds);
Зокрема, дуже цікаво виглядає рішення array_merge(...$finalIds)
, оскільки воно використовує нову концепцію PHP 7, де у функцію можна передавати динамічну кількість аргументів, використовуючи символ трикрапки на початку. Тоді процес злиття є максимально ефективним, і вся логіка автоматично обробляється внутрішньо PHP.
Скорочений запис array_merge(...$finalIds)
можна використовувати тільки для непорожніх масивів. Якщо це пустий масив, то у функцію не передається жодного аргументу і функція видає помилку Функція array_merge викликана з 0 параметрами, необхідний хоча б 1.
.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | uk