Funktionen array_map() er nok en af de mest oversete funktioner i PHP, når det kommer til håndtering af arrays (i det kode jeg har set). array_map() gør kort fortalt det at den kører en funktion på alle elementer af et array.
Når man fx ønsker at gøre alle bogstaver store på alle værdier i et array ser jeg ofte følgende:
| Kopier til udklipsholder | Vis uden linie # | |
|---|---|
| 01 | <?php |
| 02 | $array = array( |
| 03 | 'test 1', |
| 04 | 'test 2', |
| 05 | 'test 3', |
| 06 | 'test 4', |
| 07 | 'test 5', |
| 08 | 'test 6', |
| 09 | 'test 7', |
| 10 | 'test 8' |
| 11 | ); |
| 12 | //gennemløb array og gem value med store bogstaver |
| 13 | foreach ($array as $key=>$value) { |
| 14 | $array[$key]=strtoupper($value); |
| 15 | } |
| 16 | ?> |
Dette fungerer også rigtigt fint, men samme opgave kan klares med et enkelt kald til array_map() - smartere og noget hurtigere:
| Kopier til udklipsholder | Vis uden linie # | |
|---|---|
| 01 | <?php |
| 02 | $array = array( |
| 03 | 'test 1', |
| 04 | 'test 2', |
| 05 | 'test 3', |
| 06 | 'test 4', |
| 07 | 'test 5', |
| 08 | 'test 6', |
| 09 | 'test 7', |
| 10 | 'test 8' |
| 11 | ); |
| 12 | $array=array_map('strtoupper',$array); |
| 13 | ?> |
array_map() tager funktionsnavnet som første parameter og vores array som andet parameter. Og vupti så har vi udført samme opgave som ovenover.
Et brugbart eksempel
Ovenstående eksempel er måske ikke det mest brugbare, men hvad med at køre stripslashes på alle felter fra en query fra mysql på en gang i stedet for at gøre det på alle felter enkeltvis?
array_map() kan også sende dit array igennem dine egne funktioner, lad os sige vi ønsker at kunne køre stripslashes() på enten et array eller en almindelig streng i samme funktion:
| Kopier til udklipsholder | Vis uden linie # | |
|---|---|
| 01 | <?php |
| 02 | /** |
| 03 | * Kør strip slashes på alt |
| 04 | * @param string | array arrayet eller strengen der skal køres stripslashes på |
| 05 | * @return string | array med hvor stripslashes er kørt |
| 06 | */ |
| 07 | function strip($value) { |
| 08 | //hvis value er et array køres strip på alle værdier i arrayen - ellers køres stripslashes |
| 09 | $value = is_array($value) ? array_map('strip', $value) : stripslashes($value); |
| 10 | //retuner array eller streng |
| 11 | return $value; |
| 12 | } |
| 13 | //hent data |
| 14 | $query= mysql_query("SELECT * FROM ...... LIMIT 1;"); |
| 15 | //kør vores strip funktion |
| 16 | $data = strip(mysql_fetch_assoc($query); |
| 17 | ?> |
Alle steder hvor der er kørt addslashes() bruger jeg ovenstående funktion, da den kan modtage data fra både mysql_fetch_assoc og mysql_result.
Håber dette lille tip kan være til hjælp - overvejede egentlig om dette ikke bare skulle være et tweet ala: "Use array_map to apply function callback to all values of an array" - men tænkte jeg hellere måtte slå et slag for at Twitter ikke er ved at dræbe blogs
Links i dette indlæg
kommentarer
Synes det er super fedt du går i dybten, men det kan virke lidt som overkill når du går så meget i dybten omkring en enkelt funktion. Men thumbs up for det gode arbejde, og rart at se at Twitter ikke er ved at dræbe blogs. ;)
Link til seneste blogindlæg: Swine flu in Peru - bringing the iFlu to Denmark
Kender mange php nørder som ikke kender array_map eller bare ikke bruger den så du er absolut ikke alene - php:array_walk er også ganske interessant i den sammenhæng, burde måske nok ha behandlet den i samme blog-indlæg så havde der været lidt mere kød på...
skriv kommentar
Felter markeret med gult og * er påkrævet
Pingbacks
Hvis du linker til en af mine blog artikler fra et blogsystem der udsender pings vil du få et gratis do-follow link fra mig, du kna også twitte om en post og få et link til din twitter profil (Jeg forbeholder mig dog retten til at slette eller nofollow spam :P)











