search for in the  
<array_keysarray_merge_recursive>
Last updated: Thu, 19 May 2005

array_map

(PHP 4 >= 4.0.6, PHP 5)

array_map --  Applies the callback to the elements of the given arrays

Description

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

array_map() returns an array containing all the elements of arr1 after applying the callback function to each one. The number of parameters that the callback function accepts should match the number of arrays passed to the array_map()

Example 1. array_map() example

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

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

This makes $b have:

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

Example 2. array_map() - using more arrays

<?php
function show_Spanish($n, $m)
{
   return(
"The number $n is called $m in Spanish");
}

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);
?>

The above example will output:

// printout of $c
Array
(
    [0] => The number 1 is called uno in Spanish
    [1] => The number 2 is called dos in Spanish
    [2] => The number 3 is called tres in Spanish
    [3] => The number 4 is called cuatro in Spanish
    [4] => The number 5 is called cinco in Spanish
)

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

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

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

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

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

)

Usually when using two or more arrays, they should be of equal length because the callback function is applied in parallel to the corresponding elements. If the arrays are of unequal length, the shortest one will be extended with empty elements.

An interesting use of this function is to construct an array of arrays, which can be easily performed by using NULL as the name of the callback function

Example 3. Creating an array of arrays

<?php
$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);
?>

The above example will output:

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
        )

)

See also array_filter(), array_reduce(), array_walk(), and information about the callback type.



User Contributed Notes
array_map
Vinicius Cubas Brand
23-Mar-2005 07:31
The following function does exaclty the same thing of array_map. However, maintains the same index of the input arrays

<?php
  
function array_map_keys($param1,$param2,$param3=NULL)
   {
      
$res = array();

       if (
$param3 !== NULL)
       {
           foreach(array(
2,3) as $p_name)
           {
               if (!
is_array(${'param'.$p_name}))
               {
                  
trigger_error(__FUNCTION__.'(): Argument #'.$p_name.' should be an array',E_USER_WARNING);
                   return;
               }
           }
           foreach(
$param2 as $key => $val)
           {
              
$res[$key] = call_user_func($param1,$param2[$key],$param3[$key]);
           }
       }
       else
       {
           if (!
is_array($param2))
           {
              
trigger_error(__FUNCTION__.'(): Argument #2 should be an array',E_USER_WARNING);
               return;
           }
           foreach(
$param2 as $key => $val)
           {
              
$res[$key] = call_user_func($param1,$param2[$key]);
           }
       }
       return
$res;
   }
?>

For instance:

<?php
   $arr1
= array(
      
'3' => 'a',
      
'4' => 'b',
      
'5' => 'c'
      
);

  
$arr2 = array(
      
'3' => 'd',
      
'4' => 'e',
      
'5' => 'f'
      
);

  
$arr3 = array_map_keys(create_function('$a,$b','return $a.$b;'),$arr1,$arr2);

  
print_r($arr3);

?>

The result will be:

Array
(
   [3] => ad
   [4] => be
   [5] => cf
)
nick at netdupeNOSPAM dot com
21-Feb-2005 11:34
This function comes in handy for $_POST, $_GET input. Allowing you to quickly check user input.

For example:

<?php

$_POST
= array_map('addslashes', $_POST);

//or

$_GET = array_map('addslashes', $_GET);

?>

You could also use it to trim, strip tags etc. Saves a lot of time when having to check a lot of input values.
endofyourself at yahoo dot com
20-Feb-2005 01:29
If you need to call a static method from array_map, this will NOT work:

<?PHP
array_map
('myclass::myMethod' , $value);
?>

Instead, you need to do this:

<?PHP
array_map
( array('myclass','myMethod') , $value);
?>

It is helpful to remember that this will work with any PHP function which expects a callback argument.
Clayton Smith
29-Nov-2004 12:28
Handle multidimensional arrays:
function array_map_recursive($func, $arr)
{
   $result = array();
   do
   {
       $key = key($arr);
       if (is_array(current($arr))) {
           $result[$key] = array_map2($func, $arr[$key]);
       } else {
           $result[$key] = $func(current($arr));
       }     
   } while (next($arr) !== false);
   return $result;
}
19-Sep-2004 05:32
Note that you can also use PHP own functions:

$dir = glob("dir/*.txt");
$sizes = array_map("filesize", $dir);
print array_sum($sizes); // 157471

This script sums that folder txt-file sizes very well !
nd0 at gmx dot de
02-Jul-2004 06:42
array_map works also fine with create_function:

<?php
$a
= array(1, 2, 3, 4, 5);
$b = array_map(create_function('$n', 'return $n*$n*$n;'), $a);
print_r($b);
?>

if you want to manipulate the elements of the array, instead to on a copy,
than take a look at array_walk:

<?php
$a
= array(1, 2, 3, 4, 5);
array_walk($a, create_function('&$n', '$n = $n*$n*$n;'));
print_r($a);
?>

The Result of both is:

Array
(
   [0] => 1
   [1] => 8
   [2] => 27
   [3] => 64
   [4] => 125
)
nd0 at gmx.de
02-Jul-2004 06:07
Here's an other example, to handle array of arrays with array_map.
Only a small modification in the callback-function.

<?php
function cube($n) {
   if (
is_array($n)) return array_map('cube', $n);
   return
$n*$n*$n;
}

$a = array(1, 2, array(3, 4, array(5)));
$b = array_map('cube', $a);
print_r($b);
?>
bishop
09-Apr-2004 07:07
Occasionally, you may find that you need to pull out a column (or several) from an array.  Here's a map-like function to do that:

<?php
function &array_shear(&$arrays, $idx1 /* ... */) {
  
$indexes = func_get_args();
  
array_shift($indexes);

  
$newArrays = array ();

   foreach (
array_keys($arrays) as $arrayKey) {
      
$newArray = array ();
       foreach (
$indexes as $index) {
          
$newArray[$index] = $arrays[$arrayKey][$index];
           unset(
$arrays[$arrayKey][$index]);
       }
      
$newArrays[$arrayKey] = $newArray;
   }

   return
$newArrays;
}
?>

So, doing this:

<?php
$t1
= array (
        
2 => array ('a', 'b', 'c'),
        
1 => array ('d', 'e', 'f'),
        
5 => array ('g', 'h', 'i'),
     );

$t2 = array_shear($t1, 1, 0);

?>

will result in:

<?php

$t1
= array (
 
2 =>  array (    2 => 'c',  ),
 
1 =>  array (    2 => 'f',  ),
 
5 =>  array (    2 => 'i',  ),
);

$t2 = array (
 
2 =>  array (    1 => 'b',    0 => 'a',  ),
 
1 =>  array (    1 => 'e',    0 => 'd',  ),
 
5 =>  array (    1 => 'h',    0 => 'g',  ),
);

?>
stephen at mu dot com dot au
07-Jan-2003 12:02
A note when doing something allong the lines of:

<?php
class foo {
  var
$var;
  function
bar() {
    
array_map(array($this, "baz"), array(1,2,3));
  }

  function
baz($arg) {
  
$this->var = $this->var + $arg;
  }
}
?>

This will *not* work as expected. You need to pass $this by reference as with:

array_map(array(&$this, "baz"), array(1,2,3));

or you'll be making a copy of the object each time, changing a value, then throwing the result away.
NetVicious IN hotmail_com
23-Nov-2002 08:00
Get the max length in an array of strings

<?php
function maxLength($str) {
   return
strlen($str);
}

$maxLen = max(array_map("maxLength", $myArray));
?>
dan at mojavelinux dot com
15-Jun-2002 12:07
Here is a better, more true version of a deep array_map.  The only negative of this function is that the array is passed by reference, so just be aware of that. (patches welcome)

<?php
function array_map_deep(&$in_array, $in_func, $in_args = array(), $in_index = 1) {
  
// fix people from messing up the index of the value
  
if ($in_index < 1) {
      
$in_index = 1;
   }

   foreach (
array_keys($in_array) as $key) {
      
// we need a reference, not a copy, normal foreach won't do
      
$value =& $in_array[$key];
      
// we need to copy args because we are doing
       // manipulation on it farther down
      
$args = $in_args;
       if (
is_array($value)) {
          
array_map_deep($value, $in_func, $in_args, $in_index);
       }
       else {
          
array_splice($args, $in_index - 1, $in_index - 1, $value);
          
$value = call_user_func_array($in_func, $args);
       }
   }
  
   return
$in_array;
}
?>

This is a neat function because you can pass an array, a function, and an array of parameters, and finally, and index of where in the array of parameters for the callback function the contents you are mapping should get replaced.  This index is human based (starts at 1), and can be used in something like a preg_replace callback, where the contents must be the 3rd index.  Enjoy!
bishop
26-Mar-2002 05:33
Sometimes you might be interested in performing a "deep" map, where you apply the callback to all elements in the array, even if the elements are stuck deep inside of some array(array(array(...))) business.

Here's an example PHP4 function that handles this case, with a little bit more flexible (and potentially more error-prone) callback parameter:

<?php
function deepmap($cb, $x) {

   if (
is_array($x)) {
      
$it = array();
       foreach (
$x as $k => $v) {
          
$it["$k"] = deepmap($cb, $x["$k"]);
       }
       return
$it;
   } else {
      
$cmd = "return (" .
              
str_replace('$__', $x, $cb) .
              
");";
       return eval(
$cmd);
   }

}

So, you could do, for example:

$some_odds  = array(1, 3, 5);
$some_evens = array(0, 2, 4, 6);
$some_nums  = array($some_odds, array($some_evens));

deepmap('pow($__, 2)', $some_odds);
deepmap('pow($__, 2)', $some_nums);
?>

Both examples square each element of the arrays, making sure to keep the array structure intact.

Note that the callback function needs to be a) quoted, and b) include the special string $__ (dollar double underscore); deepmap replaces $__ in the function call with whatever the current element is.

<array_keysarray_merge_recursive>
 Last updated: Thu, 19 May 2005
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: The Server Pages
Last updated: Thu May 19 17:35:34 2005 CDT