【问题标题】:array_walk vs array_map vs foreacharray_walk vs array_map vs foreach
【发布时间】:2012-05-14 13:52:54
【问题描述】:

我正在尝试比较这三个,但似乎只有 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 循环不会修剪。

【问题讨论】:

  • 如果你想知道性能,请看the article的图表。

标签: php arrays foreach


【解决方案1】:

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

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

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

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

Read more about references.

【讨论】:

  • foreach:为什么我必须通过引用传递它?这不是一个函数吗?
  • 不是的,对。但是,当您在没有引用的情况下声明它时,您会得到 - 一个值,而不是项目本身。如果项目是对象,它只会在没有参考的情况下工作。顺便说一句,我建议您为您正在测试的方法执行多个循环,并在 X 次运行中打印平均值。您的操作实际上并不需要太多时间,它们所用的微秒是非常近似的。
【解决方案2】:

PHP 5.3 起可以使用匿名函数。 例如:

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

玩得开心。

【讨论】:

  • 那是一个难看的数组。
  • 无论如何它看起来比丑陋的循环好多了。今天的趋势是使用更少的循环、ifs、switches,并作为最佳实践遇到。
  • @ValentinRusk 我没有听到任何关于所谓“趋势”的消息。你能详细说明一下吗?
  • @ValentinRusk 设计模式/原则与针对 foreach 使用 array_walk 无关。这些甚至都没有使用对象。那么这与 OOP 有什么关系呢? :)
  • OOP 并不反对使用循环... SOLID 与循环无关。其实array_map是一种函数式编程范式en.wikipedia.org/wiki/Map_%28higher-order_function%29
猜你喜欢
  • 2014-10-31
  • 2011-03-26
  • 2010-10-12
  • 2023-04-01
  • 2015-07-08
  • 2017-12-02
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
相关资源
最近更新 更多