Os que me conhecem sabem que nao sou grande fa do PHP, muito pelo contrario, e uma das linguagens mais deselegantes que conheco, contudo programo em PHP sempre que necessario e nao tenho medo de sujar as maos :)Para ninguem dizer que nao contribuo com a comunidade PHP trouxe este post, que partiu de um topico na lista do curso de Analise e Desenvolvimento de Sistemas no IFRS, que fala a respeito de como iterar arrays no PHP obtendo a melhor performance.Quando digo performance, nao pense que seus programas PHP irao dobrar de velocidade, na verdade sao micro-otimizacoes, ou seja, reduzem o tempo de resposta em milisegundos ate decimos de milisegundos, mas que na quantidade de acessos simultaneos, por exemplo um Web Site com muitos page views, pode trazer ganhos significativos.Indo ao ponto, os arrays no PHP, ou arrays associativos, nao sao como os arrays primitivos de outras linguagens, eles sao na verdade um map, ou dicionario, e sao armazenados como hash tables atraves de bindings em C. Dito isso, ha caracteristicas interessantes que trazem alteracoes na performance dependendo da maneira como e feito, por exemplo, este modo de iterar um array tem pouca performance:$elementos = array(); for ($i = 0; $i < 1000000; $i++) $elementos[$i] = rand(); $inicio = microtime(true);for ($i = 0; $i < count($elementos); $i++) { $elementos[$i];} $fim = microtime(true);echo ($fim - $inicio);Esta implementacao executa em 0.366 segundos no meu humilde notebook que e muito tempo se comparada a este implementacao a seguir que executa em 0.106 segundos:$elementos = array(); for ($i = 0; $i < 1000000; $i++) $elementos[$i] = rand(); $inicio = microtime(true);for ($i = 0, $count = count($elementos); $i < $count; $i++) { $elementos[$i];} $fim = microtime(true);echo ($fim - $inicio);A grande diferenca esta na funcao count, a qual e custosa em tempo, logo e melhor faze-la uma unica vez, na inicializacao do for, em vez de introduzi-la na condicao de saida. Mas nao acabou ainda, esta implementacao e ainda melhor (0.085 segundos):$elementos = array(); for ($i = 0; $i < 1000000; $i++) $elementos[$i] = rand(); $inicio = microtime(true);foreach ($elementos as $e) { $e;} $fim = microtime(true);echo ($fim - $inicio);O foreach e otimizado para atravessar o array atraves da estrutura de dados utilizada, uma lista ligada (linked list).Existem outras micro-otimizacoes que trarei num proximo post. E uma situacao comum termos de escrever um metodo (ou funcao) que aceite um numero variavel de argumentos.Existem algumas tecnicas para atingir isso, por exemplo, usando sobrecarga ou varargs.Para tratar destas tecnicas vou comecar com um estudo de caso baseado em uma API bem simples: considere uma classe utilitaria com um metodo utilizado para gerar o caminho de pao, ou popular breadcrumb. Este metodo recebe um caractere separador a seguir os niveis 1, 2 e 3. Um separador e o nivel 1 sao argumentos obrigatorios, ja o nivel 2 e 3 sao opcionais. Exemplo de uso da API:// Imprime: > HomeSystem.out.println(WebHelper.caminhoPao('>', "Home"));// Imprime: > Home > EletronicosSystem.out.println(WebHelper.caminhoPao('>', "Home", "Eletronicos"));// Imprime: > Home > Eletronicos > TV'sSystem.out.println(WebHelper.caminhoPao('>', "Home", "Eletronicos", "TV's"));Um modo de implementar, mesmo sendo uma implementacao ingenua com sobrecarga de metodo, poderia parecer-se