Spesso abbiamo bisogno di unire più array insieme, questo può essere fatto in modo molto elegante con la funzione `array_merge`:
$userIdsA = [1, 2, 3];$userIdsB = [5, 6, 7];// restituisce [1, 2, 3, 5, 6, 7]$finalIds = array_merge($userIdsA, $userIdsB);
La funzione array_merge
fonde due array in un unico grande array. Se c'è una collisione di tasti, vince il valore dell'array più a destra.
Tuttavia, spesso otteniamo un array di array che viene creato solo in un ciclo (per esempio, da un database e poi passato attraverso foreach), e quindi non sappiamo in anticipo il numero di fusioni.
Una soluzione ingenua potrebbe essere questa:
$finalIds = [];foreach ($users as $user) {$finalIds = array_merge($finalIds, $user->someIds);}
Tuttavia, questa soluzione è molto inefficiente per la CPU perché dobbiamo unire gli array insieme ad ogni iterazione e iterare su tutto il grande array.
Tuttavia, c'è una soluzione semplice in cui si modifica l'algoritmo di fusione per passare attraverso i dati solo una volta:
$finalIds = [];foreach ($users as $user) {$finalIds[] = $user->someIds;}
In questo caso, il campo $finalIds
genererà un po' più di dati, ma questo è ancora un problema minore del vantaggio di risparmiare tempo.
La fusione stessa varia a seconda della versione di PHP che stai usando, ed è risolta con un elegante trucco:
/* PHP 5.6 e precedenti */$finalIds = call_user_func_array('fusione di array', $finalIds + [[]]);/* PHP 5.6+ e successivi */$finalIds = array_merge([], ...$finalIds);/* PHP 7.4+ e successivi per campi non vuoti */$finalIds = array_merge(...$finalIds);
In particolare, la soluzione array_merge(...$finalIds)
sembra molto interessante, perché usa un nuovo concetto di PHP 7 in cui si può passare un numero dinamico di argomenti a una funzione usando il carattere tripletta all'inizio. Il processo di fusione è quindi il più efficiente possibile e l'intera logica è gestita automaticamente da PHP internamente.
La notazione abbreviata array_merge(...$finalIds)
può essere usata solo per array non vuoti. Se è un array vuoto, nessun argomento viene passato alla funzione e la funzione lancia un errore 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:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | it