PDA

View Full Version : [PHP] Dubbio su ciclo for + include


Omicron36
22-10-2015, 12:38
Salve a tutti,

Avrei un piccolo dubbio sulla logica alla base dell'istruzione "include". Il dubbio è nato dall'analisi di questo semplice script php ("index.php") che, semplicemente, dovrebbe contare i numeri da 1 a 10 per poi stamparli su schermo eseguendo l'istruzione del file "count.html".


index.php:

<?php
$output = "";
for ($count = 1; $count <= 10; ++$count)
{
$output .= "$count ";
}

include "count.html";


count.html:

<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="utf-8">
<title>test 1</title>
</head>
<body>
<p>
<?php echo $output; ?>
</p>
</body>
</html>


Sicuramente il mio dubbio è sciocco, ma non riesco a capire un concetto:

Ragionando linearmente, quali sono i passaggi d'esecuzione del codice della pagina "index.php"? Come andrebbe letto a livello di passaggi ripetuti in ciclo? Nella mia testa il ciclo for dovrebbe continuare a impostare i nuovi valori della variabile $output fino a quando $count sia <=10 e solo dopo passare all'istruzione include "count.html". Quindi, nella mia testa, il valore $output dovrebbe sovrascriversi fino ad essere uguale a 10 e solo a quel punto passare all'istruzione include stampando su schermo unicamente il valore 10.

Chiaramente non è così e, count.html, stampa su schermo il seguente risultato:

1 2 3 4 5 6 7 8 9 10


Spero di essere riuscito a spiegarmi. Sapreste aiutarmi?

Don[ITA]
22-10-2015, 13:11
Il tuo ragionamento non fà una grinza! A parte il fatto che in quello specifico esempio la variabile $output non venga sovrascritta ma funga da accumulatore per il valore $count.
L'istruzione $output .= "$count " concanena "$count " all'ultimo valore di $output. Per ottenere il comportamente da te immaginato ti basta levare il . e lasciare solo =.
Tutto ti sarà più chiaro guardando qui (http://php.net/manual/en/language.operators.string.php)

antonio338
22-10-2015, 13:22
Puoi sempre includere un if all'interno del tuo ciclo for.
Quindi diventerebbe:

if ($count === 10) {
include "count.html";
}

e eseguire altro codice solo quando il contatore ha raggiunto il valore di 10.

Omicron36
22-10-2015, 13:52
Perfetto! Dunque la mia lacuna, in realtà, è legata al funzionamento di questo operatore:

.=

Riassumendo, scrivere questo:


$a .= $b


Equivale a scrivere questo:


$a = $a . "$b"


Il dubbio però rimane il medesimo!
Ho provato a fare questo esperimento:


<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="utf-8">
<title>test 1</title>
</head>
<body>

<?
$a = "";
for ($b = 1; $b <=10; ++$b)
{
$a .= "$b ";
}

echo "$a";
?>

</body>
</html>


Il risultato di questo script, su schermo, è 1 2 3 4 5 6 7 8 9 10. Anche questa volta mi aspettavo semplicemente 10!

Richiedendo l'echo di $a (alla fine del ciclo) dovrei ottenere questo: $a . "$b"
dove $b, sempre alla fine del ciclo, dovrebbe avere il valore di 10!

Cosa continua a sfuggirmi??

Omicron36
22-10-2015, 14:17
Eureka!

Ho finalmente compreso.
In sostanza, durante il ciclo, la variabile $a acquisisce cumulativamente pezzetti di testo!

Prima $a è vuota.
Poi diventa "1 "
Poi diventa "1 2 "
Poi diventa "1 2 3 "

E così via.

Dunque, alla fine del ciclo, $a sarà semplicemente 1 2 3 4 5 6 7 8 9 10!

Perfetto. Grazie mille per l'aiuto, non avevo colto di aver male interpretato, in realtà, il funzionamento dell'operatore .=

Alla prossima!