Scrittura di cicli in PHP: due modi; Stessa cosa
Quando si lavora con una raccolta in PHP, in particolare gli array in PHP, ci sono due modi in cui si vedono principalmente le informazioni manipolate:
- attraverso
foranelli, - attraverso una varietà di
arrayfunzioni fornite da PHP.
Per quel che vale, penso che le array funzioni forniscano una maggiore leggibilità, ma hanno dimostrato di essere più lente (soprattutto con dati più grandi – con dati più piccoli, sarà naturalmente trascurabile).
Lavoro spesso con fori loop e le relative funzioni per ottenere la stessa cosa, ma ho pensato che valesse la pena guardare un esempio del post precedente e come ho usato le arrayfunzioni per ottenere le stesse cose di un for loop.
In definitiva, questo è un post di confronto, ma penso che sia bello vedere come lo stesso codice può essere scritto in modi diversi.
Scrivere loop in PHP
Fin dall’inizio, non sto facendo una pretesa su quale sia meglio. Questo è semplicemente per mostrare come la scrittura di loop in PHP può essere ottenuta in diversi modi.
Sta a te decidere come implementarlo.
L’obiettivo di questo esempio è mostrare:
- come ottenere i tag per un determinato post,
- leggere i loro nomi è un array delimitato da pipe,
- restituisce i nomi dei tag separati dalla pipe in un formato stringa.
Ed ecco i due modi per farlo.
Utilizzo di un ciclo standard
L’uso di un ciclo standard for potrebbe assomigliare a questo:
<?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, '|');
Si noti che io:
- inizializzare una stringa,
- leggi i tag
- scorrere e aggiungerli solo se non esistono già,
- separare l’array usando una pipe,
- rimuovere eventuali tubi di trascinamento
Quindi ho la stringa che posso restituire.
Utilizzo delle funzioni di matrice
In questo esempio, sto facendo la stessa cosa ma il codice è un po’ più compatto:
<?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())) );
È utile leggere il codice dalla funzione più interna a quella più esterna. Detto questo, ecco cosa sta succedendo:
- Sto prendendo i tag, scorrendo ciascuno di essi usando una funzione anonima passata a
array_map, - Quindi uso l’array restituito e lo passo in
array_filtermodo che i duplicati vengano rimossi, - Quindi converto l’array in una stringa delimitata da pipe.
Proprio come sopra, ho la stringa che posso restituire.
Questo è tutto?
Sì – e basta. Non sto dicendo che la leggibilità della seconda funzione sia migliore ma dirò che richiede meno passaggi.
Ricorda, inoltre, che set di dati più grandi potrebbero non funzionare altrettanto bene.
Indipendentemente da ciò, l’uso delle funzioni di matrice integrate è davvero utile perché fornisce un livello di funzionalità integrate native di PHP (mentre i for loop sono più comuni in tutte le lingue) che può farci risparmiare tempo (come filtrare i dati duplicati).
Qualche riferimento?
Attualmente si. A parte il manuale PHP, penso che Carl Alexander abbia probabilmente l’articolo più completo su questo argomento.
Vale la pena dedicare del tempo a leggerlo per intero, soprattutto se hai trovato interessante questo particolare post.
