2012-05-05 15 views
19

Estoy tratando de comparar estos tres pero parece que solo array_map funciona.array_walk vs array_map vs foreach

$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>"; 
} 

¿Qué estoy haciendo mal? Aquí está la salida:

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 

No es el recorte de array_walk y el bucle foreach.

+0

Si desea conocer el rendimiento, consulte los gráficos de [el artículo] (https://leve.rs/blog/benchmark-analysis-of-php-array-loops). – Apostle

Respuesta

16

array_walk no mira lo que da la función de resultado. En su lugar, pasa a la devolución de llamada una referencia al valor del artículo. Así que su código para que funcione tiene que ser

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

foreach no almacena los valores cambiados en sí tampoco. Cámbielo a

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

Read more about references.

+0

para el foreach: ¿por qué tengo que pasarlo por referencia? no es una función ¿verdad? – Michelle

+3

No es, correcto. Pero cuando lo declaras sin una referencia, eso es lo que obtienes: un valor, no un elemento en sí mismo. Solo funcionaría sin referencia si los elementos fueran objetos. Por cierto, te sugiero que hagas múltiples ciclos para los métodos que estás probando e imprimes en promedio en ejecuciones X. Sus acciones realmente no toman mucho tiempo y los microsegundos que toman son muy aproximados. – Slava

3

A partir de PHP 5.3 Anónimo Funciones posibles. ex:

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

Have fun.

+25

Esa es una matriz de aspecto feo. –

+0

De todos modos se ve mucho mejor que los bucles feos. La tendencia actual es utilizar menos bucles, si, interruptores y se encuentra como las mejores prácticas. –

+0

@ValentinRusk No escuché nada sobre la llamada "tendencia". ¿Puedes elaborar? –

Cuestiones relacionadas