Met PHP-arrays op de juiste manier werken

In deze zelfstudie maak ik een lijst met veelgebruikte PHP-arrayfuncties met voorbeelden van gebruik en praktische tips. Elke PHP-ontwikkelaar moet weten hoe deze moet worden gebruikt en hoe arrayfuncties moeten worden gecombineerd om code leesbaar en kort te maken.

Ook is er een presentatie met gegeven codevoorbeelden, dus je kunt het downloaden van de gerelateerde links en het aan je collega's laten zien om een ​​sterker team te bouwen.

De basis

Laten we beginnen met de basisfuncties die werken met array-toetsen en waarden. Een daarvan is array_combine (), waarmee een array wordt gemaakt met één array voor sleutels en een andere voor de waarden ervan:

$ toetsen = ['sky', 'grass', 'orange']; $ waarden = ['blauw', 'groen', 'oranje']; $ array = array_combine ($ keys, $ values); print_r ($ array); // Array // (// [sky] => blue // [grass] => green // [orange] => orange //) 

U moet weten dat de functie array_values ​​() een geïndexeerde array van waarden retourneert, array_keys () retourneert een array met sleutels van een gegeven array en array_flip () wisselt sleutels uit met waarden:

print_r (array_keys ($ array)); // ['sky', 'grass', 'orange'] print_r (array_values ​​($ array)); // ['blauw', 'groen', 'oranje'] print_r (array_flip ($ array)); // Array // (// [blue] => sky // [green] => grass // [orange] => orange //)

Maak uw code korter

De functielijst (), die niet echt een functie is, maar een taalconstructie, is ontworpen om op een korte manier variabelen toe te wijzen. Hier is bijvoorbeeld een eenvoudig voorbeeld van het gebruik van de lijst() functie:

// define array $ array = ['a', 'b', 'c']; // zonder lijst () $ a = $ array [0]; $ b = $ array [1]; $ c = $ array [2]; // met lijst () lijst ($ a, $ b, $ c) = $ array;

Deze constructie werkt perfect met functies zoals preg_slit () of  ontploffen() . U kunt ook enkele parameters overslaan, als u ze niet hoeft te definiëren:

$ string = 'hallo | wild | world'; lijst ($ hallo,, $ wereld) = ontploffen ('|', $ string); echo ("$ hallo, $ wereld"); // Hallo Wereld

Ook, lijst() kan worden gebruikt met foreach, wat deze constructie nog beter maakt:

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

Met de functie extract () kunt u een associatieve array exporteren naar variabelen. Voor elk element van een array wordt een variabele gemaakt met de naam van een sleutel en waarde als een waarde van het element:

$ array = ['clothes' => 't-shirt', 'size' => 'medium', 'color' => 'blue',]; extract ($ array); echo ("$ clothes $ size $ color"); // t-shirt medium blauw

Wees bewust van extract() is niet veilig als u met gebruikersgegevens werkt (zoals resultaten van verzoeken), dus is het beter om deze functie met de vlaggen te gebruiken EXTR_IF_EXISTS en EXTR_PREFIX_ALL.

Het tegenovergestelde van de vorige functie is de functie compact (), die een associatieve array maakt van variabelen:

$ clothes = 't-shirt'; $ size = 'medium'; $ color = 'blue'; $ array = compact ('clothes', 'size', 'color'); print_r ($ array); // Array // (// [clothes] => t-shirt // [size] => medium // [color] => blue //)

Functies filteren

Er is een goede functie voor array-filtering en dit wordt array_filter () genoemd. Geef de array door als de eerste param en een anonieme functie als de tweede param. terugkeer waar in een callback-functie als u dit element in de array wilt achterlaten, en vals als je dat niet doet:

$ getallen = [20, -3, 50, -99, 55]; $ positive = array_filter ($ numbers, function ($ number) return $ number> 0;); print_r ($ positief); // [0 => 20, 2 => 50, 4 => 55] 

Er is een manier om niet alleen te filteren op de waarden. Je kunt gebruiken ARRAY_FILTER_USE_KEY of ARRAY_FILTER_USE_BOTH als een derde parameter om de sleutel of zowel de waarde als de toets door te geven aan de terugbelfunctie.

Je kunt ook bellen array_filter () zonder een terugroep om alle lege waarden te verwijderen:

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

U kunt alleen unieke waarden uit een array krijgen met de functie array_unique (). Merk op dat de functie de sleutels van de eerste unieke elementen zal behouden:

$ 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 //) 

Met array_column () kunt u een lijst met kolomwaarden ophalen uit een multidimensionale array, zoals een antwoord uit een SQL-database of een import uit een CSV-bestand. Geef een array- en kolomnaam gewoon door:

$ array = [['id' => 1, 'title' => 'tree'], ['id' => 2, 'title' => 'sun'], ['id' => 3, 'titel '=>' cloud '],]; $ ids = array_column ($ array, 'id'); print_r ($ ids); // [1, 2, 3] 

Beginnend met PHP 7, array_column () wordt nog krachtiger, omdat het nu is toegestaan ​​met een reeks objecten te werken. Werken met een reeks modellen werd zo eenvoudiger:

$ cinemas = Cinema :: find () -> all (); $ cinema_ids = array_column ($ cinema's, 'id'); // php7 voor altijd!

Door de reeksen lopen

Met array_map () kunt u een callback toepassen op elk element van een array. U kunt een functienaam of anonieme functie doorgeven om een ​​nieuwe array op basis van de opgegeven array te krijgen:

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

Er is een mythe dat er geen manier is om waarden en sleutels van een array door te geven aan een callback, maar we kunnen het kapot maken:

$ model = ['id' => 7, 'naam' => 'James']; $ callback = function ($ key, $ value) return "$ key is $ value"; ; $ res = array_map ($ callback, array_keys ($ model), $ model); print_r ($ res); // Array // (// [0] => id is 7 // [1] => naam is James //)

Maar dit ziet er vies uit. Het is beter om array_walk () te gebruiken. Deze functie ziet er hetzelfde uit als array_map (), maar het werkt anders. Allereerst wordt een array doorgegeven door een referentie, dus array_walk () maakt geen nieuwe array aan, maar verandert een gegeven array. Dus als bronarray kunt u de arraywaarde door een referentie in een callback doorgeven. Array-sleutels kunnen ook gemakkelijk worden doorgegeven:

$ fruits = ['banana' => 'geel', 'apple' => 'groen', 'oranje' => 'oranje',]; array_walk ($ fruits, function (& $ value, $ key) $ value = "$ key is $ value";); print_r ($ vruchten); // Array // (// [banana] => banaan is geel // [apple] => appel is groen // [oranje] => oranje is oranje //)

Lid worden van de Arrays

De beste manier om twee of meer arrays samen te voegen in PHP is om de array_merge () -functie te gebruiken. Items van arrays worden samengevoegd en waarden met dezelfde stringtoetsen worden overschreven met de laatste waarde:

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

Gebruik array_diff () om arraywaarden uit een andere array (of arrays) te verwijderen. Gebruik array_intersect () om waarden te krijgen die aanwezig zijn in gegeven arrays. De volgende voorbeelden laten zien hoe het werkt:

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

Doe de wiskunde met matrixwaarden

Gebruik array_sum () om een ​​som van arraywaarden te krijgen, array_product () om ze te vermenigvuldigen of maak uw eigen formule met array_reduce ():

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

Gebruik array_count_values ​​() om alle waarden van een array te tellen. Het geeft alle unieke waarden van een gegeven array als sleutels en een telling van deze waarden als een waarde:

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

Arrays genereren

Gebruik array_fill () om een ​​array met een gegeven grootte en dezelfde waarde te genereren:

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

Gebruik bereik () om een ​​array te genereren met een bereik van sleutels en waarden, zoals daguren of letters:

$ letters = bereik ('a', 'z'); print_r ($ letters); // ['a', 'b', ..., 'z'] $ hours = range (0, 23); print_r ($ uur); // [0, 1, 2, ..., 23]

Gebruik array_slice () om een ​​deel van een array te krijgen, bijvoorbeeld alleen de eerste drie elementen:

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

Arrays sorteren

Het is goed om te onthouden dat elke sorteerfunctie in PHP met arrays werkt door een verwijzing en retourneert waar op succes of vals bij falen. Er is een eenvoudige sorteerfunctie met de naam sort () en sorteert waarden in oplopende volgorde zonder de sleutels te behouden. De sorteerfunctie kan worden voorafgegaan door de volgende letters:

  • een, sorteer bewaar sleutels
  • k, sorteren op toetsen
  • r, sorteren in omgekeerde / aflopende volgorde
  • u, sorteren met een gebruikersfunctie

U kunt de combinaties van deze letters in de volgende tabel zien:

een k r u
een een soort
arsort uasort
k ksort krsort
r arsort krsort rsort
u uasort
usort

Combinatie van array-functies als een baas

De echte magie begint wanneer u arrayfuncties begint te combineren. Hier ziet u hoe u lege waarden kunt trimmen en verwijderen in slechts één regel code met array_filter () en array_map ():

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

Om een ​​id naar een titelkaart te maken op basis van een reeks modellen, kunnen we een combinatie van gebruiken array_combine () en array_column ():

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

Om de top drie van een array te krijgen, kunnen we gebruiken array_count_values ​​(), arsort (), en array_slice ():

$ letters = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'd', 'd', 'd', 'd ']; $ values ​​= array_count_values ​​($ letters); // krijg sleutel om array arsort te tellen ($ waarden); // sort descending preserving key $ top = array_slice ($ values, 0, 3); // krijg top 3 print_r ($ top); // Array // (// [d] => 5 // [a] => 4 // [b] => 2 //)

Het is gemakkelijk te gebruiken array_sum () en array_map () om de som van de volgorde in een paar rijen te berekenen:

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

Conclusie

Zoals u kunt zien, kan kennis van de hoofdarrayfuncties uw code veel korter en leesbaarder maken. Natuurlijk heeft PHP nog veel meer array-functies, en zelfs de gegeven functies hebben veel variaties om te gebruiken met extra parameters en vlaggen, maar ik denk dat we in deze tutorial de basis hebben behandeld die elke PHP-ontwikkelaar moet weten.

Houd er rekening mee dat ik een presentatie met de gegeven voorbeelden heb gemaakt, zodat je deze kunt downloaden van de gerelateerde links en deze aan je team kunt laten zien.

Als u vragen heeft, aarzel dan niet om hen te vragen in de commentaren op het artikel. 

Verder lezen en gerelateerde links

  • Arrays Manual op php.net
  • Anonieme functies (sluitingen) op php.net
  • Download een presentatie voor uw team