le code utilisé pour le test :

<?php

class test
{
function test()
    {
    $this->arr = range(0, 100000);
    $this->cnt = count($this->arr);
    }

function loop1()
    {
    static $i = 0;
    if ($i < $this->cnt)
        {
        $this->v = & $this->arr$i;
        $i++;
        return true;
        }
    else
        {
        return false;
        }
    }


function loop2()
    {
    return list(,$this->v) = each($this->arr);
    }


function loop3()
    {
    $this->v = & current($this->arr);
    if ($this->v !== false)
        {
        next($this->arr);
        return true;
        }
    else
        return false;
    }

function loop4()
    {
    return (false !== $this->v = & current($this->arr) && next($this->arr));
    }

function getExecutionTime($func)
    {
    $time_start = microtime_float();
    while( $this->$func() );
    $time_end = microtime_float();
    $time = $time_end - $time_start;
    echo '<h1>'.$func.' : '.$time.'</h1>';
    reset($this->arr);
    }
}


function microtime_float()
{
   list($usec, $sec) = explode(" ", microtime());
   return ((float)$usec + (float)$sec);
}


// main

$test = new test();

$test->getExecutionTime('loop1');
$test->getExecutionTime('loop2');
$test->getExecutionTime('loop3');
$test->getExecutionTime('loop4');
?>

Les résultats pour les 4 fonctions :

  • loop1 : 0.858052968979
  • loop2 : 0.82940196991
  • loop3 : 0.871843099594
  • loop4 : 0.780961036682

Dans la fonction 3 le paramètre & ne fait apparemment aucun effets, les temps sont identiques avec ou sans. Alors que dans la fonction 4 le & est indispensable.

Remarque : Ceci n'est pas le genre de fonction a utiliser si on doit juste parcourir un tableau, ce n'est pas le but de cet article