php - array_walk vs array_map vs foreach

标签 php arrays foreach

我正在尝试比较这三个,但似乎只有 array_map 有效。

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

我做错了什么?这是输出:

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

array_walkforeach 循环没有修剪。

最佳答案

array_walk不看结果函数给出了什么。相反,它通过回调传递对项目值的引用。所以你的代码让它工作需要是

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

foreach 本身也不存储更改的值。改成

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

Read more about references .

关于php - array_walk vs array_map vs foreach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10458660/

相关文章:

PHP 无法添加或更新子字段 - 外键错误

php - 单击浏览器的后退按钮后保留表单值

javascript - 当 ng-repeat 上的复选框具有 required 属性时,Angular ng-model 更改为未定义

javascript - 将变量重用到循环中 - NodeJS

node.js - 如何与 forEach 同时执行 Promise?

php - PHP 应用程序和 Ruby 应用程序之间的通信、传递信息

php - 在页面刷新/关闭之前设置 cookie

javascript - 对于每个元素,onclick 更改值

javascript - Angular 2 数组 : categorize into data sets based on user input

javascript - filterRangeInPlace(arr, a, b) 获取数组 arr 并从中删除除 a 和 b 之间的值之外的所有值