Geralmente, existem três métodos para percorrer um array: for, while e foreach. O mais simples e conveniente deles é o foreach. Então, quais são as diferenças de operação e desempenho entre eles? Qual método geralmente é melhor usar?
Vamos primeiro testar o tempo necessário para percorrer um array unidimensional com 50.000 subscritos:
Plataforma de teste:
Processador central: PM 725
Memória: 512M
Disco rígido: 40G 5400 rpm
SO: Windows XP SP2
código de teste
apache 2.0.54 php5.0.4
:
<?php
/*
* @Autor: Lilov
* @ Página inicial: www.codesky.com
* @ E-mail: [email protected]
*
*/
$arr = array();
for($i = 0; $i < 50000; $i++){
$arr[] = $i*rand(1000.9999);
}
função GetRunTime()
{
list($usec,$sec)=explode(" ",microtime());
return ((float)$usec+(float)$sec);
}
####################################
$time_start = GetRunTime();
for($i = 0; $i < contagem($arr); $i++){
$str.= $arr[$i];
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'Tempo usado para:'.round($time_used, 7).'(s)<br><br>';
unset($str, $time_start, $time_end, $time_used);
####################################
$time_start = GetRunTime();
while(list($key, $val) = each($arr)){
$str.= $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'Tempo usado de while:'.round($time_used, 7).'(s)<br><br>';
unset($str, $key, $val, $time_start, $time_end, $time_used);
####################################
$time_start = GetRunTime();
foreach($arr as $key => $val){
$str.= $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'Tempo usado de foreach:'.round($time_used, 7).'(s)<br><br>';
####################################
?>
Resultados do teste:
média dos três resultados do teste:
Corresponde a for, while, foreach respectivamente
0,1311650
0,1666853
0,1237440
Após testes repetidos, os resultados mostram que, para percorrer o mesmo array, foreach é o mais rápido e o mais lento é o while. foreach é cerca de 20% ~ 30% mais rápido que while. Em seguida, aumente o subscrito da matriz para 500.000 e 5.000.000 e os resultados do teste serão os mesmos. Mas do ponto de vista principal, foreach opera em uma cópia do array (copiando o array), enquanto while opera movendo o índice interno do array. De modo geral, acredita-se que while deva ser mais rápido que foreach (porque. foreach primeiro coloca o array onde é copiado, enquanto while move o ponteiro interno diretamente), mas o resultado é exatamente o oposto. A razão deveria ser que foreach é uma implementação interna do PHP, enquanto while é uma estrutura de loop geral.
Portanto, em aplicações gerais, prefiro utilizar o formulário foreach, que é simples e eficiente. No PHP5, foreach também pode percorrer os atributos de uma classe.