PHP 8.0.24 Released!

array_map

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

array_mapAplica uma função em todos os elementos dos arrays dados

Descrição

array_map(?callable $callback, array $array, array ...$arrays): array

array_map() retorna um array contendo os resultados da aplicação do callback ao valor correspondente do array (e arrays se mais arrays forem fornecidos) usados como argumentos para a função de callback. O número de parâmetros que a função callback aceita deve coincidir com o número de arrays passados para array_map(). Arrays de entrada excedentes são ignorados. Um ArgumentCountError é lançado se um número insuficiente de argumentos é fornecido.

Parâmetros

callback

Um callable para executar para cada elemento em cada array.

null pode ser passado como um valor para callback para realizar uma operação zip em múltiplos arrays. Se apenas array for fornecido, array_map() retornará o array de entrada.

array

Um array para percorrer chamando função callback.

arrays

Lista variável suplementar de argumentos array para passar pela função callback.

Valor Retornado

Retorna um array contendo os resultados da aplicação da função callback ao valor correspondente do array (e arrays se mais arrays forem fornecidos) usados como argumentos para o callback.

O array retornado irá preservar as chaves do argumento array se e somente se exatamente um array for passado. Se mais de um array for passado, o array retornado terá chaves inteiras sequenciais.

Changelog

Versão Descrição
8.0.0 If callback expects a parameter to be passed by reference, this function will now emit an E_WARNING.

Exemplos

Exemplo #1 Exemplo da função array_map()

<?php
function cubo($n)
{
    return (
$n $n $n);
}

$a = [12345];
$b array_map('cubo'$a);
print_r($b);
?>

Faz com que $b tenha:

Array
(
    [0] => 1
    [1] => 8
    [2] => 27
    [3] => 64
    [4] => 125
)

Exemplo #2 array_map() utilizando uma função lambda

<?php
$func 
= function($valor): int {
    return 
$valor 2;
};

print_r(array_map($funcrange(15)));

// Ou a partir do PHP 7.4.0:

print_r(array_map(fn($valor): int => $valor 2range(15)));

?>
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
    [4] => 10
)

Exemplo #3 array_map() - usando mais de um array

<?php
function mostrar_Espanhol(int $nstring $m): string
{
    return 
"O número {$n} é chamado de {$m} em espanhol";
}

function 
map_Espanhol(int $nstring $m): array
{
    return [
$n => $m];
}

$a = [12345];
$b = ["uno""dos""tres""cuatro""cinco"];

$c array_map('mostrar_Espanhol'$a$b);
print_r($c);

$d array_map('map_Espanhol'$a $b);
print_r($d);
?>

O exemplo acima irá imprimir:

// Saída de $c
Array
(
    [0] => O número 1 é chamado de uno em espanhol
    [1] => O número 2 é chamado de dos em espanhol
    [2] => O número 3 é chamado de tres em espanhol
    [3] => O número 4 é chamado de cuatro em espanhol
    [4] => O número 5 é chamado de cinco em espanhol
)

// Saída de $d
Array
(
    [0] => Array
        (
            [1] => uno
        )

    [1] => Array
        (
            [2] => dos
        )

    [2] => Array
        (
            [3] => tres
        )

    [3] => Array
        (
            [4] => cuatro
        )

    [4] => Array
        (
            [5] => cinco
        )

)

Normalmente quando se usa dois ou mais arrays, eles devem ter o mesmo tamanho porque a função callback é aplicada paralelamente nos elementos correpondentes. Se os arrays tem tamanhos diferentes, o menor array será extendido com elementos vazios.

Uma forma interessante de se usar esta função é na construção de um array de arrays, o que pode ser facilmente feito usando null como o nome da função callback.

Exemplo #4 Realizando uma operação zip de arrays

<?php
$a 
= [12345];
$b = ["um""dois""tres""quatro""cinco"];
$c = ["uno""dos""tres""cuatro""cinco"];

$d array_map(null$a$b$c);
print_r($d);
?>

O exemplo acima irá imprimir:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => one
            [2] => uno
        )

    [1] => Array
        (
            [0] => 2
            [1] => two
            [2] => dos
        )

    [2] => Array
        (
            [0] => 3
            [1] => three
            [2] => tres
        )

    [3] => Array
        (
            [0] => 4
            [1] => four
            [2] => cuatro
        )

    [4] => Array
        (
            [0] => 5
            [1] => five
            [2] => cinco
        )

)

Exemplo #5 callback null apenas com array

<?php
$array 
= [123];
var_dump(array_map(null$array));
?>

O exemplo acima irá imprimir:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

Exemplo #6 array_map() - com chaves string

<?php
$arr 
= ["chaveString" => "valor"];
function 
cb1($a) {
    return [
$a];
}
function 
cb2($a$b) {
    return [
$a$b];
}
var_dump(array_map('cb1'$arr));
var_dump(array_map('cb2'$arr$arr));
var_dump(array_map(null,  $arr));
var_dump(array_map(null$arr$arr));
?>

O exemplo acima irá imprimir:

array(1) {
  ["chaveString"]=>
  array(1) {
    [0]=>
    string(5) "valor"
  }
}
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(5) "valor"
    [1]=>
    string(5) "valor"
  }
}
array(1) {
  ["chaveString"]=>
  string(5) "valor"
}
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(5) "valor"
    [1]=>
    string(5) "valor"
  }
}

Exemplo #7 array_map() - arrays associativos

Enquanto array_map() não suporta diretamente o uso da chave do array como entrada, isso pode ser simulado usando array_keys().

<?php
$arr 
= [
    
'v1' => 'Primeiro lançamento',
    
'v2' => 'Segundo lançamento',
    
'v3' => 'Terceiro lançamento',
];
// Nota: Antes da 7.4.0, use a sintaxe mais longa para funções anônimas.
$callback fn(string $kstring $v): string => "$k foi o $v";
$result array_map($callbackarray_keys($arr), array_values($arr));
var_dump($result);
?>

O exemplo acima irá imprimir:

array(3) {
  [0]=>
  string(24) "v1 foi o Primeiro lançamento"
  [1]=>
  string(25) "v2 foi o Segundo lançamento"
  [2]=>
  string(24) "v3 foi o Terceiro lançamento"
}

Veja Também

  • array_filter() - Filtra elementos de um array utilizando uma função callback
  • array_reduce() - Reduz um array para um único valor através de um processo iterativo via função callback
  • array_walk() - Aplica uma determinada função em cada elemento de um array

add a note

User Contributed Notes 8 notes

up
28
lukasz dot mordawski at gmail dot com
8 years ago
Let's assume we have following situation:

<?php
class MyFilterClass {
    public function
filter(array $arr) {
        return
array_map(function($value) {
            return
$this->privateFilterMethod($value);
        });
    }

    private function
privateFilterMethod($value) {
        if (
is_numeric($value)) $value++;
        else
$value .= '.';
    }
}
?>

This will work, because $this inside anonymous function (unlike for example javascript) is the instance of MyFilterClass inside which we called it.
I hope this would be useful for anyone.
up
19
elfe1021 at gmail dot com
8 years ago
Find an interesting thing that in array_map's callable function, late static binding does not work:
<?php
class A {
    public static function
foo($name) {
        return
'In A: '.$name;
    }

    public static function
test($names) {
        return
array_map(function($n) {return static::foo($n);}, $names);
    }
}

class
B extends A{
    public static function
foo($name) {
        return
'In B: '.$name;
    }
}

$result = B::test(['alice', 'bob']);
var_dump($result);
?>

the result is:
array (size=2)
  0 => string 'In A: alice' (length=11)
  1 => string 'In A: bob' (length=9)

if I change A::test to
<?php
   
public static function test($names) {
        return
array_map([get_called_class(), 'foo'], $names);
    }
?>

Then the result is as expected:
array (size=2)
  0 => string 'In B: alice' (length=11)
  1 => string 'In B: bob' (length=9)
up
16
radist-hack at yandex dot ru
13 years ago
To transpose rectangular two-dimension array, use the following code:

array_unshift($array, null);
$array = call_user_func_array("array_map", $array);

If you need to rotate rectangular two-dimension array on 90 degree, add the following line before or after (depending on the rotation direction you need) the code above:
$array = array_reverse($array);

Here is example:

<?php
$a
= array(
  array(
1, 2, 3),
  array(
4, 5, 6));
array_unshift($a, null);
$a = call_user_func_array("array_map", $a);
print_r($a);
?>

Output:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 4
        )

    [1] => Array
        (
            [0] => 2
            [1] => 5
        )

    [2] => Array
        (
            [0] => 3
            [1] => 6
        )

)
up
17
Mahn
6 years ago
You may be looking for a method to extract values of a multidimensional array on a conditional basis (i.e. a mixture between array_map and array_filter) other than a for/foreach loop. If so, you can take advantage of the fact that 1) the callback method on array_map returns null if no explicit return value is specified (as with everything else) and 2) array_filter with no arguments removes falsy values.

So for example, provided you have:

<?php
$data
= [
    [
       
"name" => "John",
       
"smoker" => false
   
],
    [
       
"name" => "Mary",
       
"smoker" => true
   
],
    [
       
"name" => "Peter",
       
"smoker" => false
   
],
    [
       
"name" => "Tony",
       
"smoker" => true
   
]
];
?>

You can extract the names of all the non-smokers with the following one-liner:

<?php
$names
= array_filter(array_map(function($n) { if(!$n['smoker']) return $n['name']; }, $data));
?>

It's not necessarily better than a for/foreach loop, but the occasional one-liner for trivial tasks can help keep your code cleaner.
up
8
stijnleenknegt at gmail dot com
14 years ago
If you want to pass an argument like ENT_QUOTES to htmlentities, you can do the follow.

<?php
$array
= array_map( 'htmlentities' , $array, array_fill(0 , count($array) , ENT_QUOTES) );
?>

The third argument creates an equal sized array of $array filled with the parameter you want to give with your callback function.
up
7
CertaiN
9 years ago
The most memory-efficient array_map_recursive().

<?php
function array_map_recursive(callable $func, array $arr) {
   
array_walk_recursive($arr, function(&$v) use ($func) {
       
$v = $func($v);
    });
    return
$arr;
}
?>
up
1
anonymous_user
9 months ago
/**
  * Function which recursively applies a callback to all values and also its
  * keys, and returns the resulting array copy with the updated keys and
  * values.
  * PHP's built-in function array_walk_recursive() only applies the passed
  * callback to the array values, not the keys, so this function simply applies
  * the callback to the keys too (hence the need of working with a copy,
  * as also updating the keys would lead to reference loss of the original
  * array). I needed something like this, hence my idea of sharing it here.
  *
  * @param    callable    $func     callback which takes one parameter (value
  *                                                   or key to be updated) and returns its
  *                                                   updated value
  *
  * @param    array          $arr      array of which keys and values shall be
  *                                                   get updated
  */

function array_map_recursive(
    callable $func,
    array $arr
) {

      // Initiate copied array which will hold all updated keys + values
      $result = [];

      // Iterate through the key-value pairs of the array
      foreach ( $arr as $key => $value ) {

        // Apply the callback to the key to create the updated key value
        $updated_key = $func( $key );

        // If the iterated value is not an array, that means we have reached the
        // deepest array level for the iterated key, so in that case, assign
        // the updated value to the updated key value in the final output array
        if ( ! is_array( $value ) ) {

          $result[$updated_key] = $func( $value );

        } else {

          // If the iterated value is an array, call the function recursively,
          // By taking the currently iterated value as the $arr argument
          $result[$updated_key] = array_map_recursive(
            $func,
            $arr[$key]
          );

        }

      } // end of iteration through k-v pairs

      // And at the very end, return the generated result set
      return $result;

    } // end of array_map_recursive() function definition
up
0
Walf
6 months ago
A general solution for the problem of wanting to know the keys in the callback, and/or retain the key association in the returned array:

<?php

/**
* Like array_map() but callback also gets passed the current key as the
* first argument like so:
* function($key, $val, ...$vals) { ... }
* ...and returned array always maintains key association, even if multiple
* array arguments are passed.
*/

function array_map_assoc(callable $callback, array $array, array ...$arrays) {
   
$keys = array_keys($array);
   
array_unshift($arrays, $keys, $array);
    return
array_combine($keys, array_map($callback, ...$arrays));
}

?>

Because it uses array_map() directly, it behaves the same way in regard to ignoring the keys of subsequent array arguments. It also has the same variadic signature.
To Top