PHP Manual
/
Optimalizácia výkonu

Spájanie veľkých polí v PHP

06. 02. 2020

Často potrebujeme zlúčiť viacero polí dohromady, čo sa dá urobiť veľmi elegantne pomocou funkcie `array_merge`:

$userIdsA = [1, 2, 3];
$userIdsB = [5, 6, 7];
// vráti [1, 2, 3, 5, 6, 7]
$finalIds = array_merge($userIdsA, $userIdsB);

Funkcia array_merge zlúči dve polia do jedného veľkého poľa. Ak dôjde ku kolízii kľúčov, vyhráva hodnota pravého poľa.

Opakované spájanie v slučke

Často však dostávame pole polí, ktoré sa vytvára až v cykle (napríklad z databázy a potom sa prechádza cez foreach), a preto vopred nepoznáme počet zlúčení.

Naivné riešenie by mohlo vyzerať takto:

$finalIds = [];
foreach ($users as $user) {
$finalIds = array_merge($finalIds, $user->someIds);
}

Toto riešenie je však procesorovo veľmi neefektívne, pretože pri každej iterácii musíme polia spojiť a iterovať nad celým veľkým poľom.

Existuje však jednoduché riešenie, pri ktorom upravíme algoritmus zlučovania tak, aby údaje prechádzali iba raz:

$finalIds = [];
foreach ($users as $user) {
$finalIds[] = $user->someIds;
}

V tomto prípade pole $finalIds vygeneruje o niečo viac údajov, ale stále je to menší problém ako výhoda úspory času.

Samotné zlučovanie sa líši v závislosti od verzie PHP, ktorú používate, a rieši sa elegantným trikom:

/* PHP 5.6 a staršie */
$finalIds = call_user_func_array('array_merge', $finalIds + [[]]);
/* PHP 5.6+ a novšie */
$finalIds = array_merge([], ...$finalIds);
/* PHP 7.4+ a novšie pre neprázdne polia */
$finalIds = array_merge(...$finalIds);

Najmä riešenie array_merge(...$finalIds) vyzerá veľmi zaujímavo, pretože využíva novú koncepciu PHP 7, v rámci ktorej môžete funkcii odovzdať dynamický počet argumentov pomocou trojitého znaku na začiatku. Proces zlučovania je potom čo najefektívnejší a celú logiku automaticky spracúva interný systém PHP.

Skrátený zápis array_merge(...$finalIds) možno použiť len pre neprázdne polia. Ak je to prázdne pole, funkcii nie je odovzdaný žiadny argument a funkcia vyhodí chybu Funkcia array_merge vyvolaná s 0 parametrami, aspoň 1 požadovaný..

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