Arbetar med PHP Arrays på rätt sätt

I denna handledning kommer jag att göra en lista över vanliga PHP-arrayfunktioner med exempel på användning och bästa praxis. Varje PHP-utvecklare måste veta hur man använder dem och hur man kombinerar matrisfunktioner för att göra kodläsbar och kort.

Det finns också en presentation med givna kodexempel, så du kan ladda ner det från de relaterade länkarna och visa det till dina kollegor att bygga ett starkare lag.

Det grundläggande

Låt oss börja med de grundläggande funktioner som fungerar med array nycklar och värden. En av dem är array_combine (), som skapar en array med en array för nycklar och en annan för dess värden:

$ keys = ['sky', 'grass', 'orange']; $ values ​​= ['blue', 'green', 'orange']; $ array = array_combine ($ nycklar, $ värden); print_r ($ array); // Array // (// [sky] => blue // [gräs] => grön // [orange] => orange //) 

Du bör veta att funktionen array_values ​​() returnerar en indexerad grupp av värden, array_keys () returnerar en rad nycklar till ett givet array och array_flip () byter nycklar med värden:

print_r (array_keys ($ array)); // ['himmel', 'gräs', 'orange'] print_r (array_values ​​($ array)); // ['blå', 'grön', 'orange'] print_r (array_flip ($ array)); // Array // (// [blue] => himmel // [grön] => gräs // [orange] => orange //)

Gör din kod kortare

Funktionslistan (), som inte är en funktion utan en språkkonstruktion, är utformad för att tilldela variabler på en kort väg. Till exempel, här är ett grundläggande exempel på att använda lista() fungera:

// definiera array $ array = ['a', 'b', 'c']; // utan lista () $ a = $ array [0]; $ b = $ array [1]; $ c = $ array [2]; // med listan () lista ($ a, $ b, $ c) = $ array;

Denna konstruktion fungerar perfekt med funktioner som preg_slit () eller  explodera() . Du kan också hoppa över några parametrar, om du inte behöver dem att definieras:

$ string = 'hej | vild | värld'; lista ($ hej, $ $ world) = explodera ('|', $ string); eko ("$ hej, $ world"); // Hej världen

Också, lista() kan användas med för varje, vilket gör denna konstruktion ännu bättre:

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

Med funktionen extrakt () kan du exportera en associativ array till variabler. För varje element i en array skapas en variabel med namnet på en nyckel och ett värde som ett värde av elementet:

$ array = ['kläder' => 't-shirt', 'size' => 'medium', 'color' => 'blue',]; extrahera ($ array); eko ("$ kläder $ storlek $ färg"); // t-shirt medium blå

Var medveten om att extrahera() är inte säkert om du arbetar med användardata (som resultat av förfrågningar), så det är bättre att använda den här funktionen med flaggorna EXTR_IF_EXISTS och EXTR_PREFIX_ALL.

Tvärtemot den föregående funktionen är funktionen kompakt (), som gör en associativ grupp från variabler:

$ kläder = 't-shirt'; $ size = 'medium'; $ color = 'blue'; $ array = kompakt ('kläder', 'storlek', 'färg'); print_r ($ array); // Array // (// [clothes] => t-shirt // [size] => medium // [color] => blue //)

Filtreringsfunktioner

Det finns en bra funktion för arrayfiltrering, och det kallas array_filter (). Passera arrayen som första parametern och en anonym funktion som den andra parametern. Lämna tillbaka Sann i en återuppringningsfunktion om du vill lämna det här elementet i matrisen, och falsk om du inte gör det:

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

Det finns ett sätt att filtrera inte bara av värdena. Du kan använda ARRAY_FILTER_USE_KEY eller ARRAY_FILTER_USE_BOTH som en tredje parameter för att skicka nyckeln eller både värde och nyckel till återuppringningsfunktionen.

Du kan också ringa array_filter () utan återuppringning för att ta bort alla tomma värden:

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

Du kan bara få unika värden från en array med funktionen array_unique (). Observera att funktionen kommer att bevara nycklarna till de första unika elementen:

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

Med array_column () kan du få en lista över kolumnvärden från en mångdimensionell array, som ett svar från en SQL-databas eller en import från en CSV-fil. Bara skicka ett array och kolumnnamn:

$ array = [['id' => 1, 'title' => 'träd'], ['id' => 2, 'title' => 'sun'], ['id' => 3 ' '=>' moln '],]; $ ids = array_column ($ array, 'id'); print_r ($ id); // [1, 2, 3] 

Från PHP 7, array_column () blir ännu kraftfullare, eftersom det nu är tillåtet att arbeta med en rad objekt. Så det blev lättare att arbeta med en rad modeller.

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

Gå genom arraysna

Med hjälp av array_map () kan du göra en återuppringning till varje element i en array. Du kan skicka ett funktionsnamn eller en anonym funktion för att få en ny uppsättning baserad på den angivna raden:

$ cities = ['Berlin', 'KYIV', 'Amsterdam', 'Riga']; $ aliases = array_map ('strtolower', $ cities); print_r ($ alias); // ['berlin', 'kyiv,' amsterdam ',' riga '] $ tal = [1, -2, 3, -4, 5]; $ kvadrater = array_map (funktion ($ nummer) return $ number ** 2;, $ nummer); print_r ($ kvadrater); // [1, 4, 9, 16, 25]

Det finns en myt att det inte finns något sätt att skicka värden och nycklar till en array till en återuppringning, men vi kan byta det:

$ model = ['id' => 7, 'name' => 'James']; $ callback = funktion ($ key, $ value) return "$ nyckel är $ värde"; ; $ res = array_map ($ callback, array_keys ($ modell), $ modell); print_r ($ res); // Array // (// [0] => id är 7 // [1] => namn är James //)

Men det här ser smutsigt ut. Det är bättre att använda array_walk () istället. Den här funktionen är densamma som array_map (), men det fungerar annorlunda. Först av allt, en array passeras av en referens, så array_walk () skapar inte en ny array, men ändrar ett visst array. Så som en källmatris kan du skicka matrisvärdet med en referens i en återuppringning. Array-nycklar kan också passeras enkelt:

$ fruits = ['banana' => 'yellow', 'apple' => 'grönt', 'orange' => 'orange',]; array_walk ($ frukt, funktion ($ värde, $ key) $ value = "$ key är $ value";); print_r (frukter $); // Array // (// [banan] => Banan är gul // [Apple] => Apple är grönt // [Orange] => Orange är orange //)

Gå med i arraysna

Det bästa sättet att slå samman två eller flera arrayer i PHP är att använda funktionen array_merge (). Artiklar av arrayer kommer att slås samman och värden med samma strängtangenter skrivs över med det sista värdet:

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

För att ta bort array värden från en annan array (eller arrayer), använd array_diff (). För att få värden som finns i givna arrayer, använd array_intersect (). Nästa exempel visar hur det fungerar:

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

Gör matematik med arrayvärden

Använd array_sum () för att få en summa av arrayvärden, array_product () för att multiplicera dem, eller skapa din egen formel med array_reduce ():

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

För att räkna alla värden för en array, använd array_count_values ​​(). Det kommer att ge alla unika värden för ett givet array som nycklar och en räkning av dessa värden som ett värde:

$ things = ['apple', 'apple', 'banana', 'tree', 'tree', 'tree']; $ values ​​= array_count_values ​​($ things); print_r ($ värden); // Array // (// [apple] => 2 // [banan] => 1 // [träd] => 3 //)

Generera Arrays

För att skapa en array med en given storlek och samma värde, använd array_fill ():

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

För att generera en matris med ett intervall i nycklar och värden, som dagtid eller bokstäver, använd område ():

$ bokstäver = intervall ('a', 'z'); print_r ($ bokstäver); // ['a', 'b', ..., 'z'] $ timmar = intervall (0, 23); print_r (timmar $); // [0, 1, 2, ..., 23]

För att få en del av en array-till exempel, bara de tre första elementen - använd array_slice ():

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

Sortera Arrays

Det är bra att komma ihåg att varje sorteringsfunktion i PHP fungerar med arrays med en referens och returnerar Sann på framgång eller falsk vid misslyckande. Det finns en grundläggande sorteringsfunktion som heter sort (), och det sorterar värden i stigande ordning utan att behålla nycklar. Sorteringsfunktionen kan läggas upp med följande bokstäver:

  • en, sortera bevarande nycklar
  • k, sortera efter nycklar
  • r, sortera i omvänd / nedåtgående ordning
  • u, sortera med en användarfunktion

Du kan se kombinationerna av dessa bokstäver i följande tabell:

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

Kombinera Array-funktioner som en chef

Den verkliga magiken börjar när du börjar kombinera arrayfunktioner. Så här kan du trimma och ta bort tomma värden i en enda kodrad med array_filter () och array_map ():

$ values ​​= ['say', 'bye', ',' till ',' spaces ',']; $ words = array_filter (array_map ('trim', $ värden)); print_r (ord $); // ['say', 'bye', 'to', 'spaces']

För att skapa ett id till en titelkarta från en rad modeller kan vi använda en kombination av array_combine () och array_column ():

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

För att få de tre bästa värdena för en array kan vi använda array_count_values ​​(), arsort (), och array_slice ():

$ bokstäver = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'd', 'd', 'd' ']; $ values ​​= array_count_values ​​($ letters); // Hämta nyckeln för att räkna arrayarsortering ($ värden); // sortera nedåtgående konserveringsnyckel $ top = array_slice ($ värden, 0, 3); // få topp 3 print_r ($ top); // Array // (// [d] => 5 // [a] => 4 // [b] => 2 //)

Det är lätt att använda array_sum () och array_map () att beräkna summan av order i några rader:

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

Slutsats

Som du kan se kan kunskap om de viktigaste matrisfunktionerna göra din kod mycket kortare och mer läsbar. Självklart har PHP många fler funktioner, och även de givna funktionerna har många variationer att använda med extra parametrar och flaggor, men jag tror att i den här handledningen har vi täckt de grunder som varje PHP-utvecklare borde veta.

Observera att jag har skapat en presentation med de givna exemplen, så att du kan ladda ner den från de relaterade länkarna och visa den till ditt lag.

Om du har några frågor, tveka inte att fråga dem i kommentarerna till artikeln. 

Ytterligare läsning och relaterade länkar

  • Arrays Manual på php.net
  • Anonyma funktioner (stängningar) på php.net
  • Ladda ner en presentation för ditt lag