有人知道是否这样做
foreach ($user->getFriends() as $friend) {
// Do something.
}
使PHP多次调用用户对象上的函数getFriends(),从而提高效率吗?
$friends = $user->getFriends();
foreach ($friends as $f) {
// Do something.
}
答案 0 :(得分:21)
foreach
使用表达式$user->getFriends()
的结果。你可以这样看:
foreach (($user->getFriends()) as $friend) {
// ...
}
该函数不会被多次调用,因为您传递的是结果,而不是函数本身。 foreach
不知道该功能。
答案 1 :(得分:7)
这是一个替补代码:
srand();
$asize = 1000000;
$a = array();
for ($x=1;$x<=$asize;$x++) $a[]=rand();
$i=0;
$s = microtime(true);
foreach($a as $k=>$v) {
++$a[$k];
}
$e = microtime(true);
dolog($s,$e,'FOREACH-KEY');
$i=0;
$s = microtime(true);
foreach($a as &$v) {
++$v;
}
$e = microtime(true);
dolog($s,$e, 'FOREACH-PTR');
$i=0;
$s = microtime(true);
for ($x=0;$x<$asize;$x++){
++$a[$x];
}
$e = microtime(true);
dolog($s,$e,'FOR');
function awpp(&$item,$key){
++$item;
}
$s = microtime(true);
array_walk($a, 'awpp');
$e = microtime(true);
dolog($s,$e,'ARRAY_WALK');
reset($a);
$s = microtime(true);
while (list($k, $v) = each($a)) {
++$a[$k];
}
$e = microtime(true);
dolog($s,$e,'EACH');
reset($a);
$s = microtime(true);
$node = current($a);
++$node;
while($node=next($a)) {
++$node;
}
$e = microtime(true);
dolog($s,$e,'NEXT');
结果:
FOREACH-KEY Start: 1367595478.8087210655, End: 1367595479.2945981026, DIFF: 0.4858770370
FOREACH-PTR Start: 1367595479.2946701050, End: 1367595479.4266710281, DIFF: 0.1320009232
FOR Start: 1367595479.4267220497, End: 1367595479.6769850254, DIFF: 0.2502629757
ARRAY_WALK Start: 1367595479.6770300865, End: 1367595481.1930689812, DIFF: 1.5160388947
EACH Start: 1367595481.1931140423, End: 1367595482.5088000298, DIFF: 1.3156859875
NEXT Start: 1367595482.5088429451, End: 1367595483.2801001072, DIFF: 0.7712571621
因此,最快是 foreach with pointer 和 没有键 值。
答案 2 :(得分:6)
我不认为在这种情况下会多次调用getFriends()方法。
foreach制作数组的副本以进行迭代,然后遍历副本。没有理由多次调用您的方法。
使用foreach循环时应该考虑复制本身(以及由此产生的内存使用)。
答案 3 :(得分:0)
这取决于您希望如何使用基础数据。当你迭代最快的事情是使用for循环,预定义它的上边界(所以你不是,比如,迭代一个count函数)。
$limit=count($records);
for ( i=0; $i<$limit; i++){
// do this code;
}