Computer finestre Internet

Php per ogni comando Informazioni sulle complessità di foreach in PHP. Spacchettamento di array nidificati con list()

Il ciclo For Each ... Next in VBA Excel, la sua sintassi e descrizione dei singoli componenti. Esempi di utilizzo del ciclo For Each ... Next.

Il ciclo For Each ... Next in VBA Excel è progettato per eseguire un blocco di istruzioni in relazione a ciascun elemento da un gruppo di elementi (intervallo, matrice, raccolta). Questo meraviglioso ciclo viene utilizzato quando il numero di elementi in un gruppo e la loro indicizzazione sono sconosciuti, altrimenti è preferibile utilizzarlo.

Per ogni ... Sintassi del ciclo successivo

Per ogni elemento Nel gruppo [istruzioni] [Esci per] [istruzioni] Avanti [elemento]

V parentesi quadre vengono specificati gli attributi facoltativi del ciclo For Each ... Next.

Per ogni ... Componenti del ciclo successivo

*Se un ciclo For Each ... Next viene utilizzato in VBA Excel per scorrere gli elementi di una raccolta (oggetto Collection) o di una matrice, la variabile elemento deve essere dichiarato con tipo di dati Variante altrimenti il ​​ciclo non funzionerà.

**Se non si utilizza il codice nel ciclo, si perde il significato dell'uso del ciclo.

Per ogni ... Esempi di loop successivi

Ciclo per un intervallo di celle

Nel foglio attivo di una cartella di lavoro di Excel selezionare un intervallo di celle ed eseguire la procedura seguente:

Sub test1 () Dim element As Range, a As String a = "Dati recuperati da For Each ... Next:" For Each element In Selection a = a & vbNewLine & "Cell" & element.Address & _ " contiene il valore: "& CStr (element.Value) Next MsgBox a End Sub

La finestra di informazioni MsgBox visualizzerà gli indirizzi delle celle selezionate e il loro contenuto, se presente. Se vengono selezionate molte celle, le informazioni complete su tutte le celle non verranno visualizzate, poiché la lunghezza massima del parametro Richiestaè di circa 1024 caratteri.

Ciclo per la raccolta dei fogli

Copia la seguente procedura VBA nelle cartelle di lavoro di Excel:

Sub test2 () Dim element As Worksheet, a As String a = "Elenco dei fogli di lavoro contenuti in questo libro:" Per ogni elemento In Worksheets a = a & vbNewLine & element.Index _ & ")" & element.Name Next MsgBox a Fine sotto

La finestra delle informazioni di MsgBox visualizzerà un elenco dei nomi di tutti i fogli della cartella di lavoro di Excel in base al numero ordinale delle loro schede corrispondenti ai loro indici.

Ciclo per un array

Assegna un elenco di nomi di animali all'array e nel ciclo For Each ... Next scrivili in una variabile un... Finestra informativa MsgBox visualizzerà un elenco di nomi di animali da una variabile un.

Sub test3 () Dim element As Variant, a As String, group As Variant group = Array ("ippopotamo", "elefante", "canguro", "tigre", "topo") " foglio, ad esempio quello selezionato: gruppo = Selection a = "L'array contiene i seguenti valori:" & vbNewLine Per ogni elemento nel gruppo a = a & vbNewLine & element Next MsgBox a End Sub

Ripetiamo la stessa procedura VBA, ma impostiamo tutti gli elementi dell'array nel ciclo For Each ... Next su Parrot. La finestra delle informazioni di MsgBox visualizzerà un elenco di nomi di animali, composto solo da pappagalli, che dimostra la possibilità di modificare i valori degli elementi dell'array nel ciclo For Each ... Next.

Sub test4 () Dim element As Variant, a As String, group As Variant group = Array ("ippopotamo", "elefante", "canguro", "tigre", "topo") " foglio, ad esempio quello selezionato: group = Selection a = "L'array contiene i seguenti valori:" & vbNewLine Per ogni elemento In group element = "Parrot" a = a & vbNewLine & element Next MsgBox a End Sub

Questo codice, come tutto il resto in questo articolo, è stato testato in Excel 2016.

Ciclo per la raccolta di sottodirectory e uscita dal ciclo

In questo esempio, aggiungeremo alla variabile un nomi delle sottodirectory sul disco C il tuo computer. Quando il ciclo raggiunge la cartella File di programma , si aggiungerà alla variabile un il suo nome e il messaggio: “Basta, non leggerò oltre! Saluti, il tuo For Each ... Il prossimo ciclo. "

Sub test5 () Dim FSO As Object, myFolders As Object, myFolder As Object, a As String "Crea un nuovo FileSystemObject e assegnalo alla variabile" FSO "Set FSO = CreateObject (" Scripting.FileSystemObject ")" Estrai l'elenco di sottodirectory sul disco "C "e assegnarlo" alla variabile "myFolders" Impostare myFolders = FSO.GetFolder ("C: \") a = "Cartelle su C:" & vbNewLine "Fai scorrere l'elenco delle sottodirectory e aggiungi le loro nomi alla variabile" a "" dopo aver raggiunto la cartella "Programmi", uscire dal ciclo For Each myFolder In myFolders.SubFolders a = a & vbNewLine & myFolder.Name If myFolder.Name = "Programmi" Then a = a & vbNewLine & vbNewLine & "Basta, continua a leggere non lo farò! "_ & vbNewLine & vbNewLine &" Saluti, "& vbNewLine & _" Your For Each ... Next loop. "Exit For End If Next Set FSO = Nothing MsgBox un End Sub

Finestra informativa MsgBox visualizzerà un elenco dei nomi delle sottodirectory sul disco C il tuo computer nella cartella File di programma inclusivo e il messaggio del ciclo sulla fine del suo lavoro.

Di conseguenza, il programma visualizzerà non solo i nomi delle sottodirectory visibili durante la navigazione sul disco nell'esploratore C ma anche nascosto e cartelle di servizio... Per visualizzare un elenco di tutte le sottodirectory sul disco C, commenta il pezzo di codice da Se prima di Finisci se inclusivo ed eseguire la procedura nell'editor VBA Excel.

Esegui cicli while e foreach

Il ciclo del fare. ... ... mentre

Fai ... durante il ciclo in C#, questa è una versione post-condizionale di while. Ciò significa che la condizione del ciclo viene verificata dopo l'esecuzione del corpo del ciclo. Pertanto, i cicli do ... while sono utili in situazioni in cui un blocco di istruzioni deve essere eseguito almeno una volta. Quella che segue è la forma generale dell'istruzione del ciclo do-while:

do (dichiarazioni;) while (condizione);

Se è presente una sola istruzione, le parentesi graffe sono facoltative in questa notazione. Tuttavia, vengono spesso utilizzati per rendere più leggibile il costrutto do-while e da non confondere con il costrutto ciclo while. Il ciclo do-while viene eseguito finché l'espressione condizionale è vera. Un esempio di utilizzo di un ciclo do-while è il seguente programma che calcola il fattoriale di un numero:

Utilizzo del sistema; utilizzando System.Collections.Generic; utilizzando System.Linq; utilizzando System.Text; namespace ConsoleApplication1 (class Program (static void Main (string args) (try (// Calcola il fattoriale di int i, result = 1, num = 1; Console.WriteLine ("Inserisci un numero:"); i = int.Parse (Console .ReadLine ()); Console.Write ("\ n \ nFactorial (0) =", i); do (risultato * = num; num ++;) while (num

Per ogni ciclo

Per ogni ciclo serve per l'accesso ciclico agli elementi di una collezione, che è un gruppo di oggetti. C # definisce diversi tipi di raccolte, ognuna delle quali è un array. La seguente è la forma generale dell'istruzione ciclo foreach:

operatore foreach (digitare loop_variable_name nella raccolta);

Qui digita nome_variabile_ciclo denota il tipo e il nome di una variabile di controllo del ciclo che ottiene il valore dell'elemento successivo nella raccolta a ogni passaggio del ciclo foreach. Una raccolta denota una raccolta interrogata ciclicamente, che di seguito è una matrice. Pertanto, il tipo della variabile di ciclo deve corrispondere al tipo dell'elemento dell'array. Inoltre, il tipo può essere indicato parola chiave var. In questo caso, il compilatore determina il tipo della variabile di ciclo in base al tipo dell'elemento dell'array. Questo può essere utile per gestire determinati tipi di query. Ma, di regola, il tipo viene specificato in modo esplicito.

L'istruzione ciclo foreach funziona come segue. All'avvio del ciclo, il primo elemento dell'array viene selezionato e assegnato alla variabile del ciclo. Ad ogni passaggio successivo dell'iterazione, l'elemento successivo dell'array viene selezionato e memorizzato nella variabile di ciclo. Il ciclo termina quando tutti gli elementi dell'array sono selezionati.

Il ciclo foreach ti consente di scorrere ogni elemento della raccolta (un oggetto che rappresenta un elenco di altri oggetti). Formalmente, affinché qualcosa possa essere considerato una raccolta, deve supportare l'interfaccia IEnumerable. Esempi di raccolte includono array C#, classi di raccolte dallo spazio dei nomi System.Collection e classi di raccolte personalizzate.

(PHP 4, PHP 5, PHP 7)

Design per ciascuno fornisce un modo semplice per scorrere gli array. Per ciascuno funziona solo con array e oggetti e genererà un errore quando si tenta di utilizzarlo con variabili di altri tipi o variabili non inizializzate. Esistono due tipi di sintassi:

istruzione foreach (espressione_array come valore $) istruzione foreach (espressione_array come chiave $ => valore $) istruzione

Il primo ciclo itera sull'array specificato con espressione_array... Ad ogni iterazione, il valore dell'elemento corrente è assegnato a una variabile $ valore e il puntatore interno dell'array viene aumentato di uno (quindi, alla successiva iterazione del ciclo, il lavoro verrà eseguito con l'elemento successivo).

Il secondo ciclo correla inoltre la chiave dell'elemento corrente con una variabile tasto $ ad ogni iterazione.

Commento:

Quando l'operatore per ciascuno avvia l'esecuzione, il puntatore interno dell'arrayèimpostato automaticamente sul primo elemento Ciòsignifica che nonènecessario chiamare la funzione Ripristina () prima di usare il ciclo per ciascuno.

Poiché l'operatore per ciascuno si basa su un puntatore all'array interno, modificarlo all'interno del ciclo può portare a comportamenti imprevedibili.

Per modificare direttamente gli elementi di un array all'interno di un ciclo, la variabile $ valore deve essere preceduto da &. In questo caso, il valore sarà assegnato per riferimento.

$ arr = matrice (1, 2, 3, 4);
foreach ($ arr come & $ valore) (
$ valore = $ valore * 2;
}
// $ arr ora è un array (2, 4, 6, 8)
non impostato (valore $); // interrompe il collegamento all'ultimo elemento
?>

puntatore a $ valore possibile solo se è possibile fare riferimento all'array su cui si esegue l'iterazione (ovvero, se è una variabile). Il seguente codice non funzionerà:

foreach (array (1, 2, 3, 4) come valore & $) (
$ valore = $ valore * 2;
}
?>

Attenzione

Collegamento $ valore l'ultimo elemento dell'array rimane anche dopo l'operatore per ciascuno lavoro finito. Si consiglia di distruggerlo utilizzando la funzione non settato ().

Commento:

Operatore per ciascuno non supporta la possibilità di eliminare i messaggi di errore utilizzando il prefisso "@".

Potresti aver notato che i seguenti costrutti sono funzionalmente identici:


resetta ($ arr);
while (lista (, $ valore) = ciascuno ($ arr)) (
echo "Valore: $ valore
\ n ";
}

foreach ($ arr come valore $) (
echo "Valore: $ valore
\ n ";
}
?>

Anche i seguenti costrutti sono funzionalmente identici:

$ arr = array ("uno", "due", "tre");
resetta ($ arr);
while (lista ($ chiave, $ valore) = ciascuno ($ arr)) (

\ n ";
}

foreach ($ arr come $ chiave => $ valore) (
echo "Chiave: $ chiave; Valore: $ valore
\ n ";
}
?>

Ecco alcuni altri esempi che dimostrano l'uso dell'operatore:

/ * Esempio 1: solo valore * /

$ a = matrice (1, 2, 3, 17);

foreach ($ a come $ v) (
eco "Valore corrente di \ $ una variabile:$ v. \ n ";
}

/ * Esempio 2: valore (per l'illustrazione, l'array viene emesso come valore con una chiave) * /

$ a = matrice (1, 2, 3, 17);

$ io = 0; / * solo per chiarimenti * /

Foreach ($ a come $ v) (
echo "\ $ a [$ i] => $ v. \ n";
$i++;
}

/ * Esempio 3: chiave e valore * /

$ a = matrice (
"uno" => 1,
"due" => 2,
"tre" => 3,
"diciassette" => 17
);

foreach ($ a come $ k => $ v) (
echo "\ $ a [$ k] => $ v. \ n";
}

/ * Esempio 4: array multidimensionali * /
$ a = matrice ();
$ un [0] [0] = "un";
$ a [0] [1] = "b";
$ a [1] [0] = "y";
$ a [1] [1] = "z";

foreach ($ a come $ v1) (
foreach ($ v1 come $ v2) (
echo "$ v2 \ n";
}
}

/ * Esempio 5: array dinamici * /

Foreach (array (1, 2, 3, 4, 5) come $ v) (
echo "$ v \ n";
}
?>

Spacchettamento di array nidificati con list()

(PHP 5> = 5.5.0, PHP 7)

PHP 5.5 ha aggiunto la possibilità di attraversare un array di array decomprimendo l'array nidificato in variabili di ciclo passando elenco () come valore.

Il costrutto foreach è un esempio di for incluso nel linguaggio per rendere più facile l'iterazione sugli elementi di un array. Esistono due tipi di comando foreach, che prendono di mira diversi tipi di array:

foreach (array come elemento $) (

foreach (array come $ chiave => $ elemento) (

Ad esempio, quando si esegue il seguente frammento:

$ menu = аrrау ("pasta", "bistecca", "patate", "pesce", "patatine fritte");

foreach ($ menu come $ elemento) (

stampa "$ articolo
";

verrà visualizzato il seguente output:

In questo esempio, due cose dovrebbero essere notate. Innanzitutto, il costrutto foreach ritorna automaticamente all'inizio dell'array (ciò non accade in altri costrutti di loop). In secondo luogo, non è necessario incrementare esplicitamente il contatore o spostarsi in altro modo all'elemento successivo nell'array: ciò avviene automaticamente ad ogni iterazione di foreach.

La seconda opzione viene utilizzata quando si lavora con array associativi:

$ inventario_vino = array (

"merlot" => 15,

"zinfandel" => 17,

"sauvignon" => 32

foreach ($ wine_inventory as $ i => $ item_count) (

print "$ item_count bottiglie di $ i rimanenti
";

In questo caso, il risultato è simile a questo:

Rimangono 15 bottiglie di merlot

Rimangono 17 bottiglie di zinfandel

32 bottiglie di sauvignon rimaste

Come puoi vedere dagli esempi precedenti, il costrutto foreach rende molto più semplice lavorare con gli array.

Il principio di funzionamento della costruzione dell'interruttore è in qualche modo simile a se: il risultato ottenuto dalla valutazione di un'espressione viene verificato rispetto a un elenco di potenziali corrispondenze.

Ciò è particolarmente utile quando si controllano più valori, poiché l'uso di switch rende il programma più descrittivo e compatto. Il formato generale per un comando switch è:

interruttore (espressione) (

caso (condizione):

caso (condizione):

La condizione da verificare è indicata tra parentesi dopo la parola chiave switch. Il risultato del suo calcolo viene confrontato in sequenza con le condizioni nelle sezioni del caso. Se viene trovata una corrispondenza, viene eseguito il blocco della sezione corrispondente. Se non viene trovata alcuna corrispondenza, viene eseguito il blocco di sezione predefinito facoltativo.

Come vedrai nei capitoli seguenti, uno dei punti di forza di PHP è la gestione dell'input dell'utente. Supponiamo che il programma visualizzi un elenco a discesa con diverse opzioni e che ogni riga dell'elenco corrisponda a un comando eseguito in un costrutto case separato. È molto comodo costruire l'implementazione usando il comando switch:

$ user_input = "ricette"; // Comando selezionato dall'utente

switch ($ user_input):

caso ("ricerca"):

print "Facciamo" una ricerca! ";

caso ("dizionario"):

print "Quale parola vorresti cercare?";

caso ("ricette"):

print "Ecco un elenco di ricette ...";

print "Ecco il menu...";

Come puoi vedere dallo snippet sopra, il comando switch fornisce un'organizzazione chiara e intuitiva del codice. La variabile specificata nella clausola switch (in questo esempio, $ user_input) viene confrontata con le condizioni di tutte le successive sezioni del caso. Se il valore specificato nella sezione case corrisponde al valore della variabile da confrontare, viene eseguito il blocco di questa sezione. L'istruzione break impedisce il controllo di ulteriori sezioni case e termina l'esecuzione dell'istruzione switch. Se nessuna delle condizioni selezionate viene soddisfatta, viene richiamata la sezione predefinita facoltativa. Se non esiste una sezione predefinita e nessuna delle condizioni è soddisfatta, il comando switch termina semplicemente e l'esecuzione del programma continua con il comando successivo.

Dovresti ricordare che se non c'è un'istruzione break nella sezione case (vedi la sezione successiva), l'esecuzione dello switch continua con l'istruzione successiva fino a quando non viene incontrata un'istruzione break o non viene raggiunta la fine di un'istruzione switch. L'esempio seguente mostra le conseguenze della mancanza di un comando break dimenticato: $ value = 0.4;

interruttore (valore $):

stampa "il valore è 0.4
";

stampa "il valore è 0,6
";

stampa "il valore è 0.3
";

print "Non hai" scelto un valore! ";

Il risultato è simile a questo:

L'assenza di un comando break ha comportato non solo l'esecuzione del comando print nella sezione in cui è stata trovata la corrispondenza, ma anche il comando print nella sezione successiva. Quindi, l'esecuzione delle istruzioni switch è stata interrotta dall'istruzione switch successiva alla seconda istruzione print.

La scelta tra i comandi switch e if non ha praticamente alcun effetto sulle prestazioni del programma. La decisione di utilizzare questa o quella costruzione è piuttosto una questione personale del programmatore.

L'istruzione break interrompe immediatamente l'esecuzione dell'istruzione while, for o switch in cui si trova. Questo comando è già stato menzionato nella sezione precedente, ma l'interruzione del ciclo corrente non esaurisce le capacità del comando break. In generale, la sintassi dell'interruzione è simile alla seguente:

Il parametro facoltativo n specifica il numero di livelli di strutture di controllo che devono essere terminate dal comando break. Ad esempio, se un comando break è nidificato all'interno di due istruzioni while e il numero 2 è dopo break, entrambi i cicli vengono chiusi immediatamente. Il valore predefinito per n è 1; il passaggio a un livello può essere indicato sia da un'indicazione esplicita di 1, sia da un'indicazione del comando break senza parametro. Notare che il comando if non è uno dei costrutti di controllo interrotti dal comando break.

Spesso è necessario esaminare tutti gli elementi di un array PHP ed eseguire un qualche tipo di operazione su ciascun elemento. Ad esempio, puoi restituire ogni valore a una tabella HTML oppure puoi assegnare un nuovo valore a ciascun elemento.

In questa lezione, esamineremo il costrutto foreach durante il ciclo tra array indicizzati e associati.

Loop sui valori degli elementi

Il caso d'uso più semplice per foreach è quando si esegue il loop sui valori in un array indicizzato. Sintassi di base:

Foreach ($ array come $ value) (// Fai qualcosa con $ value) // Qui il codice viene eseguito al termine del ciclo

Ad esempio, il seguente script scorre l'elenco dei direttori in un array indicizzato e stampa il nome di ciascuno:

$ registi = array ("Alfred Hitchcock", "Stanley Kubrick", "Martin Scorsese", "Fritz Lang"); foreach ($ direttori come $ direttore) (echo $ direttore. "
"; }

Il codice sopra emetterà:

Alfred Hitchcock Stanley Kubrick Martin Scorsese Fritz Lang

Loop su chiavi e valori

E gli array associati? Quando si utilizzano questi tipi di array, è spesso necessario avere accesso alla chiave di ogni elemento e al suo valore. Il costrutto foreach ha un modo per svolgere questo compito:

Foreach ($ array come $ key => $ value) (// Fai qualcosa con $ key e / o $ value) // Qui il codice viene eseguito al termine del ciclo

Un esempio di organizzazione di un ciclo attraverso un array associato con informazioni sui film, mostra la chiave di ogni elemento e il suo valore nell'elenco delle definizioni HTML:

$ film = array ("titolo" => "Finestra posteriore", "regista" => "Alfred Hitchcock", "anno" => 1954, "minuti" => 112); eco "

"; foreach ($ film come $ chiave => $ valore) (echo"
chiave $:
"; eco"
$ valore
";) eco"
";

Questo script produrrà quando eseguito:

Titolo: La finestra sul cortile Regista: Alfred Hitchcock anno: 1954 minuti: 112

Modificare il valore di un elemento

Ma che dire della variazione del valore di un elemento durante il ciclo? Puoi provare il codice in questo modo:

Foreach ($ myArray come valore $) (valore $ = 123;)

Tuttavia, se lo esegui per l'esecuzione, scoprirai che i valori nell'array non cambiare... Il motivo è che foreach funziona con una copia valori dell'array, non con l'originale. Ciò lascia intatto l'array originale.

Per modificare i valori di un array, è necessario collegamento sul valore. Per fare ciò, devi mettere il segno & davanti alla variabile valore nella costruzione foreach:

Foreach ($ myArray come valore & $) (valore $ = 123;)

Ad esempio, il seguente script scorre ogni elemento di (nome del regista) nell'array $ directors e utilizza la funzione PHP esplodi () e il costrutto elenco per scambiare nome e cognome:

$ registi = array ("Alfred Hitchcock", "Stanley Kubrick", "Martin Scorsese", "Fritz Lang"); // Cambia il formato del nome per ogni elemento foreach ($ directors as & $ director) (list ($ firstName, $ lastName) = esplodi ("", $ director); $ director = "$ cognome, $ firstName";) unset ( $ direttore); // Stampa il risultato finale foreach ($ directors as $ director) (echo $ director. "
"; }

Lo script produrrà:

Hitchcock, Alfred Kubrick, Stanley Scorsese, Martin Lang, Fritz

Nota che lo script chiama la funzione unset() per rimuovere la variabile $ director al termine del primo ciclo. Questa è una buona pratica se prevedi di utilizzare la variabile più avanti nello script in un contesto diverso.

Se non si elimina il collegamento, c'è il rischio nell'ulteriore esecuzione del codice di un riferimento casuale all'ultimo elemento dell'array ("Lang, Fritz"), se si continua a utilizzare la variabile $ director, che porterà a conseguenze impreviste!

Riepilogo

In questo tutorial, abbiamo visto come utilizzare il costrutto PHP foreach per scorrere gli elementi di un array. Sono stati considerati i seguenti problemi:

  • Come scorrere gli elementi di un array
  • Come accedere alla chiave e al valore di ogni articolo
  • Come utilizzare un riferimento per modificare i valori mentre si cammina nel ciclo