Sunday, 6 November 2016

php - Difference between array_map, array_walk and array_filter



What exactly is the the difference between array_map, array_walk and array_filter. What I could see from documentation is that you could pass a callback function to perform an action on the supplied array. But I don't seem to find any particular difference between them.



Do they perform the same thing?
Can they be used interchangeably?



I would appreciate your help with illustrative example if they are different at all.


Answer





  • Changing Values:


  • Array Keys Access:


  • Return Value:



    • array_map returns a new array, array_walk only returns true. Hence, if you don't want to create an array as a result of traversing one array, you should use array_walk.


  • Iterating Multiple Arrays:


    • array_map also can receive an arbitrary number of arrays and it can iterate over them in parallel, while array_walk operates only on one.


  • Passing Arbitrary Data to Callback:



    • array_walk can receive an extra arbitrary parameter to pass to the callback. This mostly irrelevant since PHP 5.3 (when anonymous functions were introduced).


  • Length of Returned Array:


    • The resulting array of array_map has the same length as that of the largest input array; array_walk does not return an array but at the same time it cannot alter the number of elements of original array; array_filter picks only a subset of the elements of the array according to a filtering function. It does preserve the keys.




Example:






$origarray1 = array(2.4, 2.6, 3.5);
$origarray2 = array(2.4, 2.6, 3.5);

print_r(array_map('floor', $origarray1)); // $origarray1 stays the same

// changes $origarray2

array_walk($origarray2, function (&$v, $k) { $v = floor($v); });
print_r($origarray2);

// this is a more proper use of array_walk
array_walk($origarray1, function ($v, $k) { echo "$k => $v", "\n"; });

// array_map accepts several arrays
print_r(
array_map(function ($a, $b) { return $a * $b; }, $origarray1, $origarray2)
);


// select only elements that are > 2.5
print_r(
array_filter($origarray1, function ($a) { return $a > 2.5; })
);

?>




Result:



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

[0] => 2
[1] => 2
[2] => 3
)
0 => 2.4
1 => 2.6
2 => 3.5
Array
(
[0] => 4.8

[1] => 5.2
[2] => 10.5
)
Array
(
[1] => 2.6
[2] => 3.5
)

No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...