Mergování velkých polí v PHP
Č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:
Kontakt Spolupráce