Le code utilisé pour le premier test :

function test(&$v,$k)
	{
	$v = "value = ".$v;
	}

array_walk($this->arr, 'test');

Le code utilisé pour le second test :

array_walk($this->arr, create_function('&$v,$k', '$v = "value = ".$v;'));

Chaque test est effectué avec le même tableau de 100000 entrées (création du tableau : $this->arr = range(0, 100000);).

Les résultats :

  • test 1 : 0.74749994278 secondes
  • test 2 : 0.539376020432 secondes

edit : ajout du code source complet pour mieu comprendre (coup de bol, je ne l'avais pas supprimé)

<?php

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

function loop1()
	{
	function test(&$v,$k)
		{
		$v = "value = ".$v;
		}

	array_walk($this->arr, 'test');
	}

function loop2()
	{
	array_walk($this->arr, create_function('&$v,$k', '$v = "value = ".$v;'));
	}

function getExecutionTime($func)
	{
	$time_start = microtime_float();
	$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);
}

$test = new test();

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

du coup, je me doit de donner quelques explications complémentaires :)

le & devant une variable permet de passer le paramètre par référence (et non pas par copie). Dans l'exemple, c'est utilisé dans la déclaration de fonction function test(&$v,$k) en fait si la valeur de $v est modifiée dans la fonction, la valeur de la variable passée en paramètre sera aussi modifiée car on travaille sur le même espace mémoire, ce qui donne un gain de performance.