Til Top

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

kommentarer

Skrevet d. 7. Juni 2009 22:50 af Christian Jessen
Bruger billede Hmm, jeg kende faktisk ikke denne funktion.. Nu er jeg så hellerikke den største PHP-nørd, men det er nu meget rart at kunne læse sig til nogle gode tips.

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. ;)
Skrevet d. 8. Juni 2009 08:04 af Martin Nielsen
Bruger billede Du har ret det kan være lidt overkill - tror heller ikke det var blevet til et blog indlæg hvis jeg ikke havde "strip" funktionen som jeg ville dele. Og så kunne jeg se i min statistik at jeg havde en del forespørgsler på "kør funktion på array".

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







Sikkerheds kode


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)