Can a PHP spread operator be used with a traversable object?

PHP: array_merge() vs. Splat-operatoren (...)

13/05/2019

Rating: 4.63 (6832 votes)

Som PHP-udviklere står vi konstant over for opgaven at skulle manipulere arrays. En af de mest almindelige operationer er at kombinere eller flette to eller flere arrays sammen til et enkelt. I årevis har den primære metode været den indbyggede funktion array_merge(), en pålidelig og velkendt arbejdshest. Men med introduktionen af nyere PHP-versioner, specifikt PHP 7.4, fik vi et nyt, elegant værktøj i vores arsenal: splat-operatoren (...) til array-udpakning. Selvom begge kan opnå et lignende resultat, er deres opførsel og ydeevne markant forskellige i visse scenarier. At forstå disse forskelle er afgørende for at skrive robust, læsbar og effektiv kode. Denne artikel vil dykke ned i begge metoder, sammenligne deres fordele og ulemper, og give klare retningslinjer for, hvornår du skal vælge den ene frem for den anden.

What is Splat operator in PHP?
The splat operator (…) was introduced in PHP 5.6 as a convenient way to unpack arrays and pass their elements as arguments to functions or constructors. It simplifies array manipulation and function calls, offering a concise syntax for working with array data. Here’s how it works: Concise and expressive syntax for unpacking array elements.
Indholdsfortegnelse

Den Klassiske Tilgang: array_merge() Funktionen

Funktionen array_merge() er en fundamental del af PHP's array-manipulationsværktøjer. Den tager et eller flere arrays som input og returnerer et nyt array, der indeholder elementerne fra alle de angivne arrays. Den er alsidig og kan håndtere både indekserede og associative arrays.

Lad os se på et grundlæggende eksempel med associative arrays (nøgle-værdi-par):

$array1 = ['farve' => 'rød', 'størrelse' => 'medium']; $array2 = ['vægt' => 50, 'producent' => 'PHP']; $resultat = array_merge($array1, $array2); print_r($resultat); // Output: // Array // ( // [farve] => rød // [størrelse] => medium // [vægt] => 50 // [producent] => PHP // )

Hvis der er overlappende strengnøgler, vil værdien fra det sidste array i kaldet overskrive de foregående.

Fordele ved array_merge()

  • Bred Kompatibilitet: Funktionen har eksisteret i lang tid og er tilgængelig i stort set alle PHP-versioner, du måtte støde på, hvilket gør den ideel til projekter med krav om bagudkompatibilitet.
  • Fleksibel med Argumenter: Den kan acceptere et vilkårligt antal arrays som argumenter, hvilket gør det nemt at flette mange kilder sammen i et enkelt funktionskald.
  • Etableret og Forudsigelig: Som en langvarig del af PHP er dens opførsel veldokumenteret og kendt af de fleste udviklere.

Ulemper ved array_merge()

  • Håndtering af numeriske nøgler: Dette er den vigtigste ulempe og kilde til mange fejl. Når array_merge() bruges på arrays med numeriske nøgler, vil den genindeksere resultatet. Nøglerne bliver ikke bevaret, men starter i stedet fra 0 og tæller op. Dette kan føre til uventet adfærd, hvis du er afhængig af de oprindelige nøgler.
  • Ydeevne: Da det er et funktionskald, medfører det en lille overhead sammenlignet med en sprogkonstruktion som splat-operatoren. For meget store arrays eller i stramme løkker kan denne forskel blive mærkbar.
  • Hukommelsesforbrug: Funktionen returnerer altid et *nyt* array. For meget store arrays betyder det, at der midlertidigt skal allokeres hukommelse til både de originale arrays og det nye, flettede array.

Den Moderne Metode: Splat-operatoren (...)

Splat-operatoren, også kendt som argument unpacking operator, blev introduceret i PHP 5.6. I PHP 7.4 blev dens funktionalitet udvidet, så den også kan bruges til at udpakke arrays inde i et andet array-definition. Dette giver en utrolig kortfattet og læsbar syntaks for at flette arrays.

Her er det samme eksempel som før, men implementeret med splat-operatoren:

$array1 = ['farve' => 'rød', 'størrelse' => 'medium']; $array2 = ['vægt' => 50, 'producent' => 'PHP']; $resultat = [...$array1, ...$array2]; print_r($resultat); // Output er identisk med array_merge() eksemplet

Syntaksen er renere og mere intuitiv for mange udviklere. Ligesom med array_merge() vil værdier med samme strengnøgle fra senere arrays overskrive de tidligere.

Fordele ved Splat-operatoren

  • Kortfattet Syntaks: Koden bliver mere læsbar og udtryksfuld. Det er visuelt klart, at elementerne fra et array bliver 'spredt ud' inde i et nyt.
  • Ydeevne: Da splat-operatoren er en sprogkonstruktion og ikke et funktionskald, er den generelt hurtigere end array_merge(). Forskellen er måske lille, men i performance-kritiske applikationer kan det have betydning.
  • Bevarelse af Numeriske Nøgler: Dette er den afgørende fordel. I modsætning til array_merge(), bevarer splat-operatoren de oprindelige numeriske nøgler, når den fletter indekserede arrays. Dette er den forventede opførsel i de fleste tilfælde.

Ulemper ved Splat-operatoren

  • PHP Version Krav: For at bruge den til at flette arrays, kræver det PHP 7.4 eller nyere. Dette gør den uanvendelig i ældre, legacy-projekter.
  • Kun for Arrays og Traversables: Den kan kun bruges på variabler, der er arrays eller implementerer Traversable interfacet. Forsøger man at bruge den på andet, resulterer det i en fatal fejl.

Direkte Sammenligning: En Oversigtstabel

For at gøre forskellene helt klare, er her en tabel, der sammenligner de to metoder side om side.

Egenskabarray_merge()Splat-operator (...)
SyntaksFunktionskald: array_merge($arr1, $arr2)Sprogkonstruktion: [...$arr1, ...$arr2]
PHP VersionPHP 4+PHP 7.4+ (for array-fletning)
Håndtering af numeriske nøglerGenindekserer. Nøglerne nulstilles og tælles op fra 0.Bevarer de oprindelige nøgler.
Håndtering af strengnøglerSenere værdier overskriver tidligere.Senere værdier overskriver tidligere.
YdeevneGod, men med overhead fra funktionskald.Generelt hurtigere, da det er en sprogkonstruktion.
LæsbarhedMeget klar for erfarne PHP-udviklere.Anses ofte for at være mere moderne og intuitiv.

Hvornår Skal Man Vælge Hvad? Praktiske Scenarier

Valget mellem de to metoder afhænger næsten udelukkende af dit specifikke behov og de tekniske begrænsninger i dit projekt.

  • Brug `array_merge()`, når...
    • ...du arbejder på et projekt, der skal køre på en PHP-version ældre end 7.4.
    • ...du *specifikt ønsker* at genindeksere et numerisk array. Det kan være en nem måde at rydde op i et array, hvor elementer er blevet fjernet, og du vil have en pæn, fortløbende indeksering.
  • Brug splat-operatoren (`...`), når...
    • ...du arbejder i et moderne PHP-miljø (7.4+).
    • ...du har brug for at flette arrays, mens du bevarer de numeriske nøgler. Dette er det mest almindelige scenarie.
    • ...du prioriterer ydeevne og en ren, moderne syntaks.
    • ...du fletter arrays inde i en funktions return-statement eller en anden array-definition for at opnå mere kompakt kode.

Ofte Stillede Spørgsmål (FAQ)

Er splat-operatoren altid hurtigere end `array_merge()`?

I de fleste benchmarks er splat-operatoren hurtigere, især ved et stort antal små arrays. Forskellen skyldes primært, at `array_merge()` er et funktionskald, som har en lille overhead, mens `...` er en del af selve sproget. For de fleste almindelige applikationer vil forskellen dog være ubetydelig. Vælg primært baseret på den ønskede opførsel (især ift. numeriske nøgler) og kodens læsbarhed.

Hvad sker der, hvis jeg blander indekserede og associative arrays?

Begge metoder håndterer dette fint. De associative dele (med strengnøgler) vil blive flettet, hvor senere værdier overskriver tidligere, og de indekserede dele (med numeriske nøgler) vil blive behandlet i henhold til deres respektive regler: `array_merge()` vil genindeksere dem, mens splat-operatoren vil forsøge at bevare nøglerne.

Kan jeg bruge plus-operatoren (`+`) til at flette arrays?

Ja, `+` operatøren kan også bruges til at 'forene' arrays, men dens opførsel er anderledes. Den bevarer nøglerne fra det første array og ignorerer elementer fra det andet array, hvis nøglen allerede eksisterer i det første. Den overskriver *ikke* værdier. Den er derfor ikke en erstatning for `array_merge()` eller splat, men et værktøj til en anden opgave.

Konklusion

Både `array_merge()` og splat-operatoren er effektive værktøjer til at flette arrays i PHP. Valget er ikke blot et spørgsmål om stil, men om funktionel korrekthed. Den afgørende forskel ligger i deres håndtering af numeriske nøgler. `array_merge()` genindekserer, mens splat-operatoren bevarer dem. For moderne PHP-udvikling (version 7.4 og frem) bør splat-operatoren være dit standardvalg på grund af dens forudsigelige opførsel, bedre ydeevne og rene syntaks. `array_merge()` forbliver dog et essentielt værktøj for legacy-systemer og i de sjældne tilfælde, hvor en genindeksering af arrayet er præcis det, du har brug for.

Hvis du vil læse andre artikler, der ligner PHP: array_merge() vs. Splat-operatoren (...), kan du besøge kategorien Sundhed.

Go up