Php 数组\漫游vs数组\映射vs foreach

Php 数组\漫游vs数组\映射vs foreach,php,arrays,foreach,Php,Arrays,Foreach,我试着比较这三个,但似乎只有array\u map起作用 $input = array( ' hello ','whsdf ',' lve you',' '); $input2 = array( ' hello ','whsdf '

我试着比较这三个,但似乎只有
array\u 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>";
}
它不是为
array\u walk
foreach
循环进行修剪。

不查看结果函数给出的结果。相反,它向回调传递对项值的引用。因此,您的代码需要

function walk_trim(&$value) {
    $value = trim($value);
}
foreach
本身也不存储更改的值。换成

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

.

从PHP 5.3开始,匿名函数是可能的。 例:

$arr=array('1
','3

','4','5'); 数组_walk($arr,函数(&$arg){ $arg=带标签($arg); }); var_dump($arr);//1,2,3,4,5 ;-)

玩得开心。

对于foreach:为什么我必须通过引用来传递它?它不是一个函数,对吗?它不是,对。但当您在没有引用的情况下声明它时,您得到的是值,而不是项本身。只有当项目是对象时,它才能在没有引用的情况下工作。顺便说一句,我建议您对正在测试的方法进行多次循环,并在X次运行时打印平均值。你的动作并不需要花费太多时间,它们花费的微秒非常接近。这是一个丑陋的数组。无论如何,它看起来比丑陋的循环要好得多。今天的趋势是使用更少的循环、ifs和开关,这是最佳实践。@ValentinRusk我没有听说任何所谓的“趋势”。你能详细说明一下吗?@ValentinRusk设计模式/原则与使用array\u walk对抗foreach无关。所有这些都没有使用对象。那么这与OOP有什么关系呢?:)OOP并不阻止循环的使用。。。实体与循环无关。事实上,
array\u map
是一种函数式编程范例。如果您想了解性能,请参阅中的图表。
foreach ($input3 as &$in) {
    $in = trim($in);
}
$arr = array('1<br/>','<a href="#">2</a>','<p>3</p>','<span>4</span>','<div>5</div>');
array_walk($arr, function(&$arg){
    $arg = strip_tags($arg);
});
var_dump($arr); // 1,2,3,4,5 ;-)