PHP 8.4.0 RC2 available for testing

array_map

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

array_mapWendet eine Callback-Funktion auf die Elemente von Arrays an

Beschreibung

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

array_map() gibt ein Array zurück, das die Ergebnisse der Anwendung der Callback-Funktion callback auf den entsprechenden Wert von array (und arrays, wenn weitere Arrays angegeben wurden) als Callback-Argumente enthält. Die Anzahl Parameter, welche callback akzeptiert, sollte der Anzahl der an array_map() übergebenen Arrays entsprechen. Überzählige Eingabe-Arrays werden ignoriert. Wenn eine zu geringe Anzahl von Argumenten übergeben wird, wird ein ArgumentCountError-Fehler ausgelöst.

Parameter-Liste

callback

Ein callable, das für jedes Element in jedem Array aufgerufen werden soll.

null kann als Wert an callback übergeben werden, um eine zip-Operation auf mehrere Arrays durchzuführen und ein Array zurückzugeben, dessen Elemente jeweils ein Array sind, das die Elemente der Eingabe-Arrays mit demselben Index enthält (siehe Beispiel unten). Wird nur array übergeben, gibt array_map() das Eingabe-Array zurück.

array

Ein Array, auf das die callback-Funktion angewendet werden soll.

arrays

Zusätzliche variable Liste von Array-Argumenten, auf die die callback-Funktion angewendet werden soll.

Rückgabewerte

array_map() gibt ein Array zurück, das die Ergebnisse der Anwendung der callback-Funktion auf den entsprechenden Wert von array (und arrays, wenn weitere Arrays angegeben wurden) als Callback-Argumente enthält.

Das zurückgegebene Array behält die Schlüssel des Array-Arguments nur bei, wenn genau ein Array übergeben wurde. Wird mehr als ein Array übergeben, hat das zurückgegebene Array aufeinanderfolgende Integer-Schlüssel.

Changelog

Version Beschreibung
8.0.0 Wenn callback einen per Referenz übergebenen Parameter erwartet, gibt diese Funktion nun einen Fehler der Stufe E_WARNING aus.

Beispiele

Beispiel #1 array_map()-Beispiel

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

$a = [1, 2, 3, 4, 5];
$b = array_map('cube', $a);
print_r($b);
?>

Dies speichert in $b:

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

Beispiel #2 array_map() mit einer Lambda-Funktion

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

print_r(array_map($func, range(1, 5)));

// Oder ab PHP 7.4.0:

print_r(array_map(fn($value): int => $value * 2, range(1, 5)));

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

Beispiel #3 array_map() - Verwendung mehrerer Arrays

<?php
function show_Spanish(int $n, string $m): string
{
return
"Die Zahl {$n} heißt auf Spanisch {$m}";
}

function
map_Spanish(int $n, string $m): array
{
return [
$n => $m];
}

$a = [1, 2, 3, 4, 5];
$b = ['uno', 'dos', 'tres', 'cuatro', 'cinco'];

$c = array_map('show_Spanish', $a, $b);
print_r($c);

$d = array_map('map_Spanish', $a , $b);
print_r($d);
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

// Ausgabe von $c
Array
(
    [0] => Die Zahl 1 heißt auf Spanisch uno
    [1] => Die Zahl 2 heißt auf Spanisch dos
    [2] => Die Zahl 3 heißt auf Spanisch tres
    [3] => Die Zahl 4 heißt auf Spanisch cuatro
    [4] => Die Zahl 5 heißt auf Spanisch cinco
)

// Ausgabe von $d
Array
(
    [0] => Array
        (
            [1] => uno
        )

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

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

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

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

)

Bei Verwendung von zwei oder mehr Arrays sollten diese die gleiche Länge besitzen, da die Callback-Funktion parallel auf die entsprechenden Elemente angewandt wird. Haben die Arrays unterschiedliche Längen, werden die kürzeren um leere Elemente erweitert, um mit der Länge des längsten übereinzustimmen.

Eine interessante Anwendung dieser Funktion ist die Konstruktion eines Arrays bestehend aus Arrays, was mit null als Name der Callback-Funktion leicht realisiert werden kann.

Beispiel #4 Durchführen einer zip-Operation von Arrays

<?php
$a
= [1, 2, 3, 4, 5];
$b = ['eins', 'zwei', 'drei', 'vier', 'fünf'];
$c = ['uno', 'dos', 'tres', 'cuatro', 'cinco'];

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

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

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

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

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

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

    [4] => Array
        (
            [0] => 5
            [1] => fünf
            [2] => cinco
        )

)

Beispiel #5 null-callback mit nur einem array

<?php
$array
= [1, 2, 3];
var_dump(array_map(null, $array));
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

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

Beispiel #6 array_map() - mit String-Schlüsseln

<?php
$arr
= ['stringkey' => 'value'];
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));
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

array(1) {
  ["stringkey"]=>
  array(1) {
    [0]=>
    string(5) "value"
  }
}
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(5) "value"
    [1]=>
    string(5) "value"
  }
}
array(1) {
  ["stringkey"]=>
  string(5) "value"
}
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(5) "value"
    [1]=>
    string(5) "value"
  }
}

Beispiel #7 array_map() - assoziative Arrays

Die array_map() unterstützt die Verwendung des Array-Schlüssels als Eingabe zwar nicht direkt, aber dies kann mit array_keys() simuliert werden.

<?php
$arr
= [
'v1' => 'erste Version',
'v2' => 'zweite Version',
'v3' => 'dritte Version',
];

// Hinweis: Vor 7.4.0 ist stattdessen die längere Syntax für anonyme
// Funktionen zu verwenden.
$callback = fn(string $k, string $v): string => "$k war die $v";

$result = array_map($callback, array_keys($arr), array_values($arr));

var_dump($result);
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

array(3) {
  [0]=>
  string(24) "v1 war die erste Version"
  [1]=>
  string(25) "v2 war die zweite Version"
  [2]=>
  string(25) "v3 war die dritte Version"
}

Siehe auch

  • array_filter() - Filtert Elemente eines Arrays mittels einer Callback-Funktion
  • array_reduce() - Reduziert das Array mittels einer Callback-Funktion iterativ auf einen einzigen Wert
  • array_walk() - Wendet eine vom Benutzer gelieferte Funktion auf jedes Element eines Arrays an

add a note

User Contributed Notes 8 notes

up
31
lukasz dot mordawski at gmail dot com
10 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
20
radist-hack at yandex dot ru
15 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
16
Mahn
8 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
3
s dot kientzler at online dot de
1 year ago
If the callback function to be called is a static method from a different namespace, the fully qualified method including namespace must be specified (a use statement is not sufficient to resolve the namespace of the callback function)

<?php
use MyTools;

$arr = [1, 2, 3];

$arr = array_map('Tools::myHelper', $arr);
?>

will cause TypeError:
array_map() expects parameter 1 to be a valid callback, class 'Tools' not found.

Use the fully qualified name for the callback instead:

<?php
$arr
= [1, 2, 3];

$arr = array_map('\MyTools\Tools::myHelper', $arr);
?>
up
8
CertaiN
11 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
8
stijnleenknegt at gmail dot com
16 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
2
Walf
2 years 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.
up
1
anonymous_user
2 years 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
To Top