array_walk vs array_map vs foreach

arrays, foreach, php

Solution

`array_walk` doesn't look at what result function gives. Instead it passes callback a reference to item value. So your code for it to work needs to be

function walk_trim(&$value) {
    $value = trim($value);
}

`foreach` doesn't store changed values itself either. Change it to

foreach ($input3 as &$in) {
    $in = trim($in);
}

Read more about references.

Problem

I'm trying to compare these three but it seems only `array_map` works. ``` $input = array( ' hello ','whsdf ',' lve you',' '); $input2 = array( ' hello ','whsdf ',' lve you',' '); $input3 = array( ' hello ','whsdf ',' lve you',' '); $time_start = microtime(true); $input = array_map('trim',$input); $time_end = microtime(true); $time = $time_end - $time_start; echo "Did array_map in $time seconds<br>"; foreach($input as $in){ echo "'$in': ".strlen($in)."<br>"; } //////////////////////////////////////////////// $time_start = microtime(true); array_walk($input2,'trim'); $time_end = microtime(true); $time = $time_end - $time_start; echo "Did array_walk in $time seconds<br>"; foreach($input2 as $in){ echo "'$in': ".strlen($in)."<br>"; } //////////////////////////////////////////////// $time_start = microtime(true); foreach($input3 as $in){ $in = trim($in); } $time_end = microtime(true); $time = $time_end - $time_start; echo "Did foreach in $time seconds<br>"; foreach($input3 as $in){ echo "'$in': ".strlen($in)."<br>"; } ``` What Am I Doing Wrong? Here's the output: ``` Did array_map in 0.00018000602722168 seconds 'hello': 5 'whsdf': 5 'lve you': 7 '': 0 Did array_walk in 0.00014209747314453 seconds ' hello ': 10 'whsdf ': 41 ' lve you': 37 ' ': 30 Did foreach in 0.00012993812561035 seconds ' hello ': 10 'whsdf ': 41 ' lve you': 37 ' ': 30 ``` It's not trimming for `array_walk` and the `foreach` loop.

Original source