PHP Manual
/
Optimalizace výkonu

Mergování velkých polí v PHP

06. 02. 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ší pro neprázdné pole */
$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.

Zkrácený zápis array_merge(...$finalIds) lze použít jen pro neprázdné pole. Pokud jde o prázdné pole, do funkce se nepředává žádný argument a funkce vyhazuje chybu Function array_merge invoked with 0 parameters, at least 1 required..

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.

Potřebujete poradit s PHP?

Nabízím trénink vývojářů, konzultace, školení a analýzu návrhových vzorů. Osobně v Praze nebo online.

Napište mi, pokud si nevíte rady.

Lektor: Jan Barášek

Status:
All systems normal.
2024