Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is PHP capable of caching count call inside loop?

Tags:

php

I know the more efficient way to have a loop over array is a foreach, or to store count in a variable to avoid to call it multiple times. But I am curious if PHP have some kind of "caching" stuff like:

for ($i=0; $i<count($myarray); $i++) { /* ... */ }

Does it have something similar and I am missing it, or it does not have anything and you should code:

$count=count($myarray);
for ($i=0; $i<$count; $i++) { /* ... */ }
like image 531
StormByte Avatar asked Mar 15 '12 04:03

StormByte


2 Answers

PHP does exactly what you tell it to. The length of the array may change inside the loop, so it may be on purpose that you're calling count on each iteration. PHP doesn't try to infer what you mean here, and neither should it. Therefore the standard way to do this is:

for ($i = 0, $length = count($myarray); $i < $length; $i++)
like image 53
deceze Avatar answered Sep 26 '22 22:09

deceze


PHP will execute the count each time the loop iterates. However, PHP does keep internal track of the array's size, so count is a relatively cheap operation. It's not as if PHP is literally counting each element in the array. But it's still not free.

Using a very simple 10 million item array doing a simple variable increment, I get 2.5 seconds for the in-loop count version, and 0.9 seconds for the count-before-loop. A fairly large difference, but not 'massive'.

edit: the code:

$x = range(1, 10000000);
$z = 0;
$start = microtime(true);
for ($i = 0; $i < count($x); $i++) {
    $z++;
}
$end = microtime(true);   // $end - $start = 2.5047581195831

Switching to do

$count = count($x);
for ($i = 0; $i < $count; $i++) {

and otherwise everything else the same, the time is 0.96466398239136

like image 22
Marc B Avatar answered Sep 26 '22 22:09

Marc B