array_map

(PHP 4 >= 4.0.6, PHP 5)

array_map — Применить функцию обратного вызова ко всем элементам указанных массивов

Описание

array array_map ( mixed $callback , array $array1 [, array $array2... ] )

Функция array_map() возвращает массив, содержащий элементы всех указанных массивов после их обработки функцией обратного вызова. Количество параметров, передаваемых функции обратного вызова, должно совпадать с количеством массивов, переданным функции array_map().

Пример #1 Пример использования array_map()

function cube($n) {
    return $n*$n*$n;
}

$a = array(1, 2, 3, 4, 5);
$b = array_map("cube", $a);
print_r($b);

В результате переменная $b будет содержать:

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

Пример #2 Пример использования array_map(): обработка нескольких массивов

function show_Spanish($n, $m) {
    return "Число $n по-испански -  $m";
}

function map_Spanish($n, $m) {
    return array ($n => $m);
}

$a = array(1, 2, 3, 4, 5);
$b = array("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);

Результат выполнения:

// printout of $c
Array
(
    [0] => Число 1 по-испански -  uno
    [1] => Число 2 по-испански -  dos
    [2] => Число 3 по-испански -  tres
    [3] => Число 4 по-испански -  cuatro
    [4] => Число 5 по-испански -  cinco
)

// printout of $d
Array
(
    [0] => Array
        (
            [1] => uno
        )

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

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

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

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

)

Обычно при обработке двух или более массивов, они имею одинаковую длину, так как функция обратного вызова применяется параллельно к соответствующим элементам массивов. Если массивы имеют различную длину, самый маленький из них дополняется элементами с пустыми значениями.

Интересным эффектом при использовании этой функции является создание массива массивов, что может быть достигнуто путем использования значения NULL в качестве имени функции обратного вызова.

Пример #3 Создание массива массивов

$a = array(1, 2, 3, 4, 5);
$b = array("one", "two", "three", "four", "five");
$c = array("uno", "dos", "tres", "cuatro", "cinco");

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

Результатом выполнения вышеприведенной программы будет:

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
        )

)

См.также array_filter() и array_reduce().

Коментарии

If you want to pass an argument like ENT_QUOTES to htmlentities, you can do the follow.

<?php
$array 
array_map'htmlentities' $arrayarray_fill(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.
2008-07-22 19:17:11
http://php5.kiev.ua/manual/ru/function.array-map.html
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(
123),
  array(
456));
array_unshift($anull);
$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
        )

)
2008-11-01 15:37:35
http://php5.kiev.ua/manual/ru/function.array-map.html
Автор:
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;
}
?>
2013-08-22 23:52:36
http://php5.kiev.ua/manual/ru/function.array-map.html
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.
2013-12-03 12:55:39
http://php5.kiev.ua/manual/ru/function.array-map.html
Автор:
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.
2015-10-20 20:10:19
http://php5.kiev.ua/manual/ru/function.array-map.html
Автор:
/** 
  * 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
2021-12-16 22:15:35
http://php5.kiev.ua/manual/ru/function.array-map.html
Автор:
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($keysarray_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.
2022-03-25 01:48:21
http://php5.kiev.ua/manual/ru/function.array-map.html
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 = [123];

$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 
= [123];

$arr array_map('\MyTools\Tools::myHelper'$arr);
?>
2023-07-18 14:57:58
http://php5.kiev.ua/manual/ru/function.array-map.html

    Поддержать сайт на родительском проекте КГБ