array_map

(PHP 4 >= 4.0.6, PHP 5)

array_mapПрименяет callback-функцию ко всем элементам указанных массивов

Описание

array array_map ( callable $callback , array $arr1 [, array $... ] )

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

Список параметров

callback

Callback-функция, применяемая к каждому элементу в каждом массиве.

arr1

Массив, к которому применяется callback-функция.

array

Дополнительные массивы для обработки callback-функцией.

Возвращаемые значения

Возвращает массив, содержащий все элементы arr1 после применения callback-функции к каждому из них.

Примеры

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

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

$a = array(12345);
$b array_map("cube"$a);
print_r($b);
?>

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

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

Пример #2 Использование array_map() вместе с lambda-функцией (начиная с версии PHP 5.3.0)

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

print_r(array_map($funcrange(15)));
?>
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
    [4] => 10
)

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

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

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

$a = array(12345);
$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);
?>

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

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

// вывод $d
Array
(
    [0] => Array
        (
            [1] => uno
        )

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

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

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

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

)

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

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

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

<?php
$a 
= array(12345);
$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
        )

)

Если массив-аргумент содержит строковые ключи, то результирующий массив будет содержать строковые ключи тогда и только тогда, если передан ровно один массив. Если передано больше одного аргумента, то результирующий массив будет всегда содержать числовые ключи.

Пример #5 Использование array_map() со строковыми ключами

<?php
$arr 
= array("stringkey" => "value");
function 
cb1($a) {
    return array (
$a);
}
function 
cb2($a$b) {
    return array (
$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));
?>

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

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"
  }
}

Смотрите также

  • array_filter() - Фильтрует элементы массива с помощью callback-функции
  • array_reduce() - Итеративно уменьшает массив к единственному значению, используя callback-функцию
  • array_walk() - Применяет пользовательскую функцию к каждому элементу массива
  • create_function() - Создаёт анонимную (лямбда) функцию
  • информация о типе callback

Коментарии

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

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