@codenerd på twitter Mit seneste tweet:

Kør en funktion på alle elementer af et array med array_map i PHP

Funktionen php: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). php: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:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
    $array = array(
               'test 1',
               'test 2',
               'test 3',
               'test 4',
               'test 5',
               'test 6',
               'test 7',
               'test 8'
               );
    //gennemløb array og gem value med store bogstaver
    foreach ($array as $key=>$value) {
        $array[$key]=strtoupper($value);    
    }
?>

Dette fungerer også rigtigt fint, men samme opgave kan klares med et enkelt kald til php:array_map – smartere og noget hurtigere:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
    $array = array(
               'test 1',
               'test 2',
               'test 3',
               'test 4',
               'test 5',
               'test 6',
               'test 7',
               'test 8'
               );
    $array=array_map('strtoupper',$array);
?>

php: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?

php:array_map kan også sende dit array igennem dine egne funktioner, lad os sige vi ønsker at kunne køre php:stripslashes på enten et array eller en almindelig streng i samme funktion:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
    /**
    * Kør strip slashes på alt
    * @param string | array arrayet eller strengen der skal køres stripslashes på
    * @return string | array med hvor stripslashes er kørt
    */
    function strip($value) {
        //hvis value er et array køres strip på alle værdier i arrayen - ellers køres stripslashes
        $value = is_array($value) ?    array_map('strip', $value) : stripslashes($value);
        //retuner array eller streng
        return $value;
    }
    //hent data
    $query= mysql_query("SELECT * FROM ...... LIMIT 1;");
    //kør vores strip funktion
    $data = strip(mysql_fetch_assoc($query);
?>

Alle steder hvor der er kørt php: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

2 kommentarer

  1. 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. 😉

    Svar på kommentaren
  2. 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å…

    Svar på kommentaren

Leave a Reply to Martin Nielsen Cancel reply

Krævede felter er markeret med *.

*