Arbeider med PHP Arrays på riktig måte

I denne opplæringen skal jeg lage en liste over vanlige PHP-arrayfunksjoner med eksempler på bruk og beste praksis. Hver PHP-utvikler må vite hvordan man bruker dem og hvordan man kombinerer arrayfunksjoner for å gjøre koden lesbar og kort.

Det er også en presentasjon med gitt kodeeksempler, slik at du kan laste den ned fra de relaterte koblingene og vise det til dine kolleger for å bygge et sterkere lag.

Det grunnleggende

La oss starte med de grunnleggende funksjonene som fungerer med array nøkler og verdier. En av dem er array_combine (), som lager en matrise ved hjelp av ett array for nøkler og en annen for sine verdier:

$ keys = ['sky', 'gress', 'orange']; $ values ​​= ['blue', 'green', 'orange']; $ array = array_combine ($ keys, $ values); print_r ($ array); // Array // (// [sky] => blue // [grass] => green // [orange] => oransje //) 

Du bør vite at funksjonen array_values ​​() returnerer en indeksert rekkeverdier, array_keys () returnerer en rekke nøkler til et gitt array, og array_flip () utveksler nøkler med verdier:

print_r (array_keys ($ array)); // ['himmel', 'gress', 'oransje'] print_r (array_values ​​($ array)); // ['blue', 'green', 'orange'] print_r (array_flip ($ array)); // Array // (// [blue] => himmel // [green] => gress // [orange] => oransje //)

Lag koden din kortere

Funksjonslisten (), som egentlig ikke er en funksjon, men en språkkonstruksjon, er designet for å tilordne variabler på kort vei. For eksempel, her er et grunnleggende eksempel på bruk av liste() funksjon:

// definer array $ array = ['a', 'b', 'c']; // uten liste () $ a = $ array [0]; $ b = $ array [1]; $ c = $ array [2]; // med liste () liste ($ a, $ b, $ c) = $ array;

Denne konstruksjonen fungerer perfekt med funksjoner som preg_slit () eller  eksplodere() . Du kan også hoppe over noen parametere, hvis du ikke trenger dem til å bli definert:

$ string = 'hei | vill | verden'; liste ($ hei,, $ verden) = eksplodere ('|', $ streng); ekko ("$ hei, $ verden"); // Hei Verden

Også, liste() kan brukes med for hver, noe som gjør denne konstruksjonen enda bedre:

$ arrays = [[1, 2], [3, 4], [5, 6]]; foreach ($ arrayer som liste ($ a, $ b)) $ c = $ a + $ b; ekko ($ c. ','); // 3, 7, 11,

Med ekstrakt () -funksjonen kan du eksportere et assosiativt array til variabler. For hvert element i en matrise vil en variabel bli opprettet med navnet på en nøkkel og verdi som en verdi av elementet:

$ array = ['clothes' => 't-skjorte', 'size' => 'medium', 'color' => 'blue',]; ekstrakt ($ array); ekko ("$ klær $ størrelse $ farge"); // t-skjorte medium blå

Vær klar over at ekstrakt() er ikke trygt hvis du jobber med brukerdata (som resultat av forespørsler), så det er bedre å bruke denne funksjonen med flaggene EXTR_IF_EXISTS og EXTR_PREFIX_ALL.

Den motsatte av den forrige funksjonen er kompakt () -funksjonen, som gjør en assosiativ array fra variabler:

$ klær = 't-skjorte'; $ size = 'medium'; $ color = 'blue'; $ array = kompakt ('klær', 'størrelse', 'farge'); print_r ($ array); // Array // (// [clothes] => t-skjorte // [size] => medium // [color] => blue //)

Filtreringsfunksjoner

Det er en flott funksjon for arrayfiltrering, og den kalles array_filter (). Pass arrayet som den første param og en anonym funksjon som den andre param. Komme tilbake ekte i en tilbakeringingsfunksjon hvis du vil forlate dette elementet i matrisen, og falsk hvis du ikke gjør det:

$ tall = [20, -3, 50, -99, 55]; $ positive = array_filter ($ tall, funksjon ($ nummer) return $ number> 0;); print_r ($ positiv); // [0 => 20, 2 => 50, 4 => 55] 

Det er en måte å filtrere ikke bare av verdiene. Du kan bruke ARRAY_FILTER_USE_KEY eller ARRAY_FILTER_USE_BOTH som en tredje parameter for å sende nøkkelen eller både verdien og nøkkelen til tilbakeringingsfunksjonen.

Du kan også ringe array_filter () uten tilbakeringing for å fjerne alle tomme verdier:

$ tall = [-1, 0, 1]; $ not_empty = array_filter ($ tall); print_r ($ not_empty); // [0 => -1, 2 => 1]

Du kan bare få unike verdier fra en matrise ved hjelp av array_unique () -funksjonen. Legg merke til at funksjonen vil bevare nøklene til de første unike elementene:

$ array = [1, 1, 1, 1, 2, 2, 2, 3, 4, 5, 5]; $ uniques = array_unique ($ array); print_r ($ unike); // Array // (// [0] => 1 // [4] => 2 // [7] => 3 // [8] => 4 // [9] => 5 //) 

Med array_column () kan du få en liste over kolonnverdier fra et flerdimensjonalt array, som et svar fra en SQL-database eller en import fra en CSV-fil. Bare passere en matrise og kolonne navn:

$ array = [['id' => 1, 'title' => 'tre'], ['id' => 2, 'title' => 'sol'], ['id' => 3 ' '=>' sky '],]; $ ids = array_column ($ array, 'id'); print_r ($ IDer); // [1, 2, 3] 

Fra PHP 7, array_column () blir enda sterkere, fordi det nå er tillatt å jobbe med en rekke objekter. Så det ble lettere å jobbe med en rekke modeller:

$ cinemas = Cinema :: find () -> all (); $ cinema_ids = array_column ($ kinoer, 'id'); // php7 for alltid!

Går gjennom arrays

Ved å bruke array_map (), kan du bruke tilbakering til hvert element i en matrise. Du kan sende et funksjonsnavn eller anonym funksjon for å få et nytt utvalg basert på det angitte feltet:

$ byer = ['Berlin', 'KYIV', 'Amsterdam', 'Riga']; $ aliases = array_map ('strtolower', $ byer); print_r ($ aliaser); // ['berlin', 'kyiv,' amsterdam ',' riga '] $ tall = [1, -2, 3, -4, 5]; $ kvadrater = array_map (funksjon ($ nummer) return $ nummer ** 2;, $ tall); print_r ($ firkanter); // [1, 4, 9, 16, 25]

Det er en myte om at det ikke er mulig å overføre verdier og nøkler til en gruppe til tilbakeringing, men vi kan buste det:

$ model = ['id' => 7, 'navn' => 'James']; $ callback = funksjon ($ nøkkel, $ verdi) return "$ nøkkel er $ verdi"; ; $ res = array_map ($ tilbakeringing, array_keys ($ modell), $ modell); print_r ($ res); // Array // (// [0] => id er 7 // [1] => navnet er James //)

Men dette ser skitne ut. Det er bedre å bruke array_walk () i stedet. Denne funksjonen ser ut som den array_map (), men det virker annerledes. Først av alt, en matrise er bestått av en referanse, så array_walk () Oppretter ikke et nytt array, men endrer et gitt utvalg. Så som en kilde array, kan du passere arrayverdien med en referanse i en tilbakeringing. Array nøkler kan også sendes enkelt:

$ fruits = ['banana' => 'gul', 'apple' => 'grønt', 'oransje' => 'oransje']; array_walk ($ frukt, funksjon (& $ verdi, $ nøkkel) $ value = "$ key er $ value";); print_r ($ frukt); // Array // (// [banana] => banan er gul // [apple] => eple er grønt // [orange] => appelsin er oransje //)

Bli med i Arrays

Den beste måten å slå sammen to eller flere arrayer i PHP, er å bruke funksjonen array_merge (). Elementer av arrayer vil bli slått sammen, og verdier med de samme strengtastene vil bli overskrevet med den siste verdien:

$ array1 = ['a' => 'a', 'b' => 'b', 'c' => 'c']; $ array2 = ['a' => 'A', 'b' => 'B', 'D' => 'D']; $ fusjon = array_merge ($ array1, $ array2); print_r ($ merge); // Array // (// [a] => A // [b] => B // [c] => c // [D] => D //) 

For å fjerne arrayverdier fra en annen array (eller arrayer), bruk array_diff (). For å få verdier som er tilstede i gitt arrays, bruk array_intersect (). De neste eksemplene viser hvordan det fungerer:

$ array1 = [1, 2, 3, 4]; $ array2 = [3, 4, 5, 6]; $ diff = array_diff ($ array1, $ array2); print_r ($ diff); // [0 => 1, 1 => 2] $ krysser = array_intersect ($ array1, $ array2); print_r ($ krysser); // [2 => 3, 3 => 4]

Gjør matematikken med arrayverdier

Bruk array_sum () for å få summen av arrayverdier, array_product () for å multiplisere dem, eller lag din egen formel med array_reduce ():

$ tall = [1, 2, 3, 4, 5]; echo (array_sum ($ tall)); // 15 echo (array_product ($ numbers)); // 120 echo (array_reduce ($ tall, funksjon ($ carry, $ item) return $ carry? $ Carry / $ item: 1;)); // 0.0083 = 1/2/3/4/5 

For å telle alle verdiene i en matrise, bruk array_count_values ​​(). Det vil gi alle unike verdier av et gitt array som nøkler og en telling av disse verdiene som en verdi:

$ things = ['apple', 'apple', 'banana', 'tree', 'tree', 'tree']; $ values ​​= array_count_values ​​($ ting); print_r ($ verdier); // Array // (// [apple] => 2 // [banan] => 1 // [tre] => 3 //)

Genererer Arrays

For å generere en matrise med en gitt størrelse og samme verdi, bruk array_fill ():

$ bind = array_fill (0, 5, '?'); print_r ($ bind); // ['?', '?', '?', '?', '?'] 

For å generere en matrise med en rekkevidde i nøkler og verdier, for eksempel dagtimer eller bokstaver, bruk rekkevidde ():

$ bokstaver = rekkevidde ('a', 'z'); print_r ($ bokstaver); // ['a', 'b', ..., 'z'] $ hours = rekkevidde (0, 23); print_r ($ timer); // [0, 1, 2, ..., 23]

For å få en del av en matrise, for eksempel, bare de tre første elementene - bruk array_slice ():

$ tall = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; $ top = array_slice ($ tall, 0, 3); print_r ($ øverst); // [1, 2, 3]

Sortering Arrays

Det er godt å huske at hver sorteringsfunksjon i PHP fungerer med arrayer med referanse og retur ekte på suksess eller falsk på feil. Det er en grunnleggende sorteringsfunksjon som heter sort (), og det sorterer verdier i stigende rekkefølge uten å bevare nøklene. Sorteringsfunksjonen kan bli prepended med følgende bokstaver:

  • en, sortere bevaringsnøkler
  • k, sortere etter nøkler
  • r, sortere i omvendt / synkende rekkefølge
  • u, sortere med en brukerfunksjon

Du kan se kombinasjonene av disse bokstavene i følgende tabell:

en k r u
en asort
arsort uasort
k ksort krsort
r arsort krsort rsort
u uasort
usort

Kombinere Array Funksjoner som en Boss

Den virkelige magien begynner når du begynner å kombinere arrayfunksjoner. Slik kan du trimme og fjerne tomme verdier i bare en enkelt kode med array_filter () og array_map ():

$ values ​​= ['say', 'bye', ',' to ',' spaces ', "]; $ words = array_filter (array_map ('trim', $ values)); print_r ($ ord); // ['si', 'bye', 'til', 'mellomrom']

For å lage et id til et tittelkart fra en rekke modeller, kan vi bruke en kombinasjon av array_combine () og array_column ():

$ models = [$ model1, $ model2, $ model3]; $ id_to_title = array_combine (array_column ($ models, 'id'), array_column ($ models, 'title'));

For å få de tre beste verdiene til en matrise, kan vi bruke array_count_values ​​(), arsort (), og array_slice ():

$ bokstaver = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'd', 'd', 'd', 'd ']; $ values ​​= array_count_values ​​($ bokstaver); // få nøkkel til å telle array arsort ($ verdier); // sortert nedadgående konserveringsnøkkel $ top = array_slice ($ verdier, 0, 3); // få topp 3 print_r ($ top); // Array // (// [d] => 5 // [a] => 4 // [b] => 2 //)

Det er enkelt å bruke array_sum () og array_map () å beregne summen av rekkefølgen i noen få rader:

$ order = [['product_id' => 1, 'price' => 99, 'count' => 1], ['product_id' => 2, 'price' => 50, 'count' => 2] ['product_id' => 2, 'price' => 17, 'count' => 3],]; $ sum = array_sum (array_map (funksjon ($ product_row) return $ product_row ['price'] * $ product_row ['count'];, $ rekkefølge)); print_r ($ sum); // 250

Konklusjon

Som du kan se, kan kunnskap om de viktigste arrayfunksjonene gjøre koden mye kortere og mer lesbar. Selvfølgelig har PHP mange flere array-funksjoner, og selv de oppgitte funksjonene har mange variasjoner å bruke med ekstra parametere og flagg, men jeg tror at i denne opplæringen har vi dekket det grunnleggende at hver PHP-utvikler burde vite.

Vær oppmerksom på at jeg har laget en presentasjon med de givne eksemplene, så du kan laste den ned fra de relaterte koblingene og vise den til teamet ditt.

Hvis du har noen spørsmål, ikke nøl med å spørre dem i kommentarene til artikkelen. 

Videre lesing og beslektede lenker

  • Arrays Manual på php.net
  • Anonyme funksjoner (nedleggelser) på php.net
  • Last ned en presentasjon for teamet ditt