Escrevendo Loops em PHP: Duas Maneiras; Mesma coisa
Quando você está trabalhando com uma coleção em PHP, mais notavelmente, arrays em PHP, existem duas maneiras pelas quais você vê principalmente as informações manipuladas:
- através
forde laços, - através de uma variedade de
arrayfunções que o PHP fornece.
Para o que vale a pena, acho que as array funções fornecem maior legibilidade, mas se mostraram mais lentas (especialmente com dados maiores – com dados menores, naturalmente será insignificante).
Costumo trabalhar com forloops e funções relacionadas para conseguir a mesma coisa, mas achei que valeria a pena dar uma olhada em um exemplo do post anterior e como usei as arrayfunções para obter as mesmas coisas que um for loop.
Em última análise, este é um post de comparação, mas acho que é bom ver como o mesmo código pode ser escrito de maneiras diferentes.
Escrevendo Loops em PHP
Desde o início, não estou fazendo uma afirmação sobre o que é melhor. Isto é simplesmente para mostrar como escrever loops em PHP pode ser feito de várias maneiras.
Cabe a você como você deseja implementá-lo.
O objetivo deste exemplo é mostrar:
- como obter as tags para uma determinada postagem,
- leia seus nomes é uma matriz delimitada por pipe,
- retorne os nomes de tags separados por barra vertical em um formato de string.
E aqui estão as duas maneiras de fazer isso.
Usando um loop padrão
Usar um for loop padrão pode ser algo assim:
<?php
// Setup the array to store the tag names.
$tagNames = [];
// Iterate through all of the tags.
$tags = get_the_tags();
for ($i = 0; $i < count($tags); $i++) {
$currentTag = $tags[$i];
// Only add names that have not been added.
if (!in_array($currentTag->name, $tagNames)) {
$tagNames[] = $currentTag->name;
}
}
// Break the names of the the tags into a '|' delimited string.
$tagNameString = implode('|', $tagNames);
// Clean up the string so any trailing pipes are removed.
$tagNameString = rtrim($tagNameString, '|');
Observe que eu:
- inicializar uma string,
- leia as etiquetas
- iterar por eles e adicioná-los apenas se eles ainda não existirem,
- separe o array usando um pipe,
- remova quaisquer tubos à direita
Então eu tenho a string que posso retornar.
Usando funções de matriz
Neste exemplo, estou fazendo a mesma coisa, mas o código é um pouco mais compacto:
<?php
// Seperate each indidivudal entry by a '|'
implode(
'|',
// Remove any duplicates in the array.
array_filter(
/* iterate through the list of tags and add the names to an
* array that's returned to filter.
*/
array_map(function ($tag) {
return $tag->name;
}, get_the_tags())) );
É útil ler o código da função mais interna para a mais externa. Com isso, eis o que está acontecendo:
- Estou pegando as tags, iterando cada uma delas usando uma função anônima passada para
array_map, - Eu então uso a matriz retornada e a passo para
array_filterque as duplicatas sejam removidas, - Então eu converto o array em uma string delimitada por pipe.
Assim como acima, eu tenho a string que posso retornar.
É isso?
Sim – e é isso. Não estou dizendo que a legibilidade da segunda função seja melhor, mas direi que requer menos etapas.
Lembre-se também de que conjuntos de dados maiores podem não ter um desempenho tão bom.
Independentemente disso, usar funções de array integradas é muito bom porque fornece um nível de funcionalidade integrada nativa do PHP (enquanto for os loops são mais comuns em todas as linguagens) que podem nos poupar tempo (como filtrar dados duplicados).
Alguma Referência?
Na verdade sim. Além do manual do PHP, acho que Carl Alexander tem, sem dúvida, o artigo mais abrangente sobre este tópico.
Vale a pena ler na íntegra, especialmente se você achou este post em particular interessante.
