Mergování velkých polí v PHP

   06. 07. 2020

Často potřebujeme spojit více polí dohromady, to lze velmi elegantně provést funkcí array_merge:

$userIdsA = [1, 2, 3];
$userIdsB = [5, 6, 7];

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

Funkce array_merge spojí dvě pole do jednoho velkého. Pokud nastane kolize v klíčích, vyhraje hodnota pravého pole.

Opakované mergování v cyklu

Často však získáváme pole polí, které vzniká až v cyklu (například z databáze a pak procházíme přes foreach) a proto předem nevíme počet mergování.

Naivní řešení může vypadat třeba takto:

$finalIds = [];

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

Toto řešení je však velmi neefektivní vůči CPU, protože musíme s každou iterací mergovat pole dohromady a celé velké pole opakovaně procházet.

Existuje však jednoduché řešení, kdy upravíme mergovací algoritmus, abychom data procházeli jen jednou:

$finalIds = [];

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

V tomto případě v poli $finalIds bude vznikat o trochu více dat, ale stále to je menší problém, než výhoda, která vznikne uspořením času.

Samotné mergování se liší podle verze PHP, kterou používáte a řeší se elegantním trikem:

/* PHP 5.6 a starší */
$finalIds = call_user_func_array('array_merge', $finalIds + [[]]);

/* PHP 5.6+ a novější */
$finalIds = array_merge([], ...$finalIds);

/* PHP 7.4+ a novější */
$finalIds = array_merge(...$finalIds);

Zejména řešení array_merge(...$finalIds) vypadá velmi zajímavě, protože využívá nového konceptu PHP 7, kdy lze předat dynamický počet argumentů do funkce pomocí znaku trojtečky na začátku. Proces mergování je pak maximálně efektivní a celou logiku si vyřeší PHP uvnitř automaticky.

Nechte si posílat nové články do mailu:

Jan Barášek     Více o autorovi

Autor článku podniká jako fullstack senior developer v Praze. Spravuje 300 různě velkých webových projektů, fungujících dodnes. Během spolupráce nabral hluboké zkušenosti, které na tomto webu předává dál.

Rád vám pomůžu:

Kontakt Konzultace a služby Nabídka spolupráce