PHP Manual

Об'єднання великих масивів в PHP

06. 02. 2020

Часто нам потрібно об'єднати декілька масивів разом, це можна зробити дуже елегантно за допомогою функції `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:

Související články

1.
3.
Status:
All systems normal.
2024