Lezione 3: Controllo flusso e array

Ora impariamo a prendere decisioni (if) e ripetere azioni (while, for). Gli array memorizzano liste di dati.

Struttura if

Prende decisioni:

<?php
    $voto = 7;  // Esempio voto
    
    if ($voto >= 6) {
        echo "Promosso!";
    } else {
        echo "Bocciato.";
    }
?>

Puoi annidare elseif per più casi:

if ($voto >= 9) {
    echo "Ottimo!";
} elseif ($voto >= 7) {
    echo "Buono";
} elseif ($voto >= 6) {
    echo "Sufficiente";
} else {
    echo "Ripeti";
}

Ciclo while

Ripete finché una condizione è vera:

<?php
    $contatore = 1;
    while ($contatore <= 5) {
        echo "Numero: " . $contatore . "<br>";
        $contatore++;  // Incrementa
    }
    // Stampa: 1,2,3,4,5
?>

Ciclo for

Per cicli con numero noto di ripetizioni:

<?php
    for ($i = 1; $i <= 5; $i++) {
        echo "Numero: " . $i . "<br>";
    }
?>

Array

Liste di dati:

<?php
    // Array numerico (indici da 0)
    $voti = array(8, 6, 9, 7);
    
    // O così:
    $voti[0] = 8;
    $voti[1] = 6;
    
    // Array associativo
    $alunno = array(
        "nome" => "Mario",
        "cognome" => "Rossi",
        "voto" => 8
    );
?>

Approfondimento Array Associativo: come un “dizionario”

È un array dove invece di numeri (0,1,2…) usi parole come chiavi per trovare i valori.

Array NUMERICO (normale)

$voti = array(8, 6, 9, 7);
echo $voti[0];  // 8 (posizione 0)
echo $voti[2];  // 9 (posizione 2)

Problema: Devi ricordare le posizioni!

Array ASSOCIATIVO (dizionario)

$alunno = array(
    "nome" => "Mario",
    "cognome" => "Rossi", 
    "eta" => 16,
    "voto" => 8
);
echo $alunno["nome"];     // Mario
echo $alunno["voto"];     // 8

Vantaggio: Usi nomi logici invece di numeri!

Sintassi completa

<?php
// Metodo 1: array()
$persona = array(
    "nome" => "Anna", 
    "citta" => "Napoli",
    "altezza" => 1.65
);

// Metodo 2: assegnazione diretta
$persona["nome"] = "Anna";
$persona["citta"] = "Napoli";
$persona["altezza"] = 1.65;

// Metodo 3: short syntax (PHP 5.4+)
$persona = [
    "nome" => "Anna",
    "citta" => "Napoli",
    "altezza" => 1.65
];
?>

Esempi pratici

Dati Alunno:

$alunno = [
    "nome" => "Luca",
    "classe" => "3B",
    "materie" => ["Matematica" => 8, "Italiano" => 7]
];

echo "Studente: " . $alunno["nome"] . "<br>";
echo "Voto mate: " . $alunno["materie"]["Matematica"];

Esempio completo:

<!DOCTYPE html>
<html>
<body>
<?php
$libro = [
    "titolo" => "Harry Potter",
    "letto" => true  // Prova a cambiare in false!
];

echo "Libro: " . $libro["titolo"] . "<br>";
echo "Stato letto: "; 
var_dump($libro["letto"]);  // Mostra: bool(true)

if ($libro["letto"]) {
    echo "<strong style='color:green'>Già letto! ✅</strong>";
} else {
    echo "<strong style='color:orange'>Da leggere 📖</strong>";
}
?>
</body>
</html>

Funzioni per array

  • count($array): numero elementi.
  • foreach: scorre tutti gli elementi.

Esempio:

<?php
    $voti = array(8, 6, 9, 7);
    $numero_voti = count($voti);  // 4
    
    echo "Media voti: ";
    $somma = 0;
    foreach ($voti as $voto) {
        $somma += $voto;
    }
    echo $somma / $numero_voti;  // 7.5
?>

Approfondimento foreach

foreach è come un “assistente automatico” che scorre tutti gli elementi di un array, uno per uno.

$voti = array(8, 6, 9, 7);  // Il nostro array

Sintassi:

foreach ($array as $variabile_temporanea) {
    // Qui fai qualcosa con ogni elemento
}

Cosa succede nel nostro esempio:

foreach ($voti as $voto) {
    $somma += $voto;
}

Passo 1: $voti[0] = 8$voto diventa 8$somma = 0 + 8 = 8

Passo 2: $voti[1] = 6$voto diventa 6$somma = 8 + 6 = 14

Passo 3: $voti[2] = 9$voto diventa 9$somma = 14 + 9 = 23

Passo 4: $voti[3] = 7$voto diventa 7$somma = 23 + 7 = 30

Fine: Ha visitato tutti e 4 gli elementi!

Visualizziamolo:

<?php
$voti = array(8, 6, 9, 7);
echo "Array voti: ";
print_r($voti);  // Mostra: Array ( [0] => 8 [1] => 6 [2] => 9 [3] => 7 )

echo "<br>Scorrimento foreach:<br>";
$somma = 0;
foreach ($voti as $voto) {
    echo "- Visito $voto, somma ora = " . ($somma + $voto) . "<br>";
    $somma += $voto;
}
echo "<br>Somma finale: $somma";
?>

Output:

Array voti: Array ( [0] => 8 [1] => 6 [2] => 9 [3] => 7 )
Scorrimento foreach:

  • Visito 8, somma ora = 8
  • Visito 6, somma ora = 14
  • Visito 9, somma ora = 23
  • Visito 7, somma ora = 30
    Somma finale: 30

Perché è utile?

  • Non serve sapere la lunghezza dell’array (a differenza di for).
  • Funziona anche con array associativi:
$alunni = array("Mario" => 8, "Luca" => 6, "Anna" => 9);
foreach ($alunni as $nome => $voto) {
    echo "$nome ha preso $voto<br>";
}
// Mario ha preso 8
// Luca ha preso 6  
// Anna ha preso 9

Confronto con for:

// CON for (devi sapere la lunghezza)
for ($i = 0; $i < count($voti); $i++) {
    $somma += $voti[$i];
}

// CON foreach (più semplice!)
foreach ($voti as $voto) {
    $somma += $voto;
}

Dunque il foreach è perfetto quando vuoi solo i VALORI, senza indici!


Esempio completo:

<!DOCTYPE html>
<html>
<head>
    <title>Media classe</title>
</head>
<body>
    <h1>Calcolo media voti</h1>
    
    <?php
        // Array voti classe
        $votiClasse = array(7, 8, 6, 9, 7, 8, 5);
        
        // Calcolo somma e media
        $somma = 0;
        foreach ($votiClasse as $voto) {
            $somma += $voto;
        }
        $media = $somma / count($votiClasse);
        
        // Decisione
        if ($media >= 7) {
            $giudizio = "Classe promossa!";
        } else {
            $giudizio = "Classe deve migliorare.";
        }
        
        echo "<p>Somma voti: $somma</p>";
        echo "<p>Numero alunni: " . count($votiClasse) . "</p>";
        echo "<p>Media: $media</p>";
        echo "<p><strong>$giudizio</strong></p>";
    ?>
</body>
</html>

Esercizio

  1. Crea array con 5 voti casuali (usa rand(1,10)).
  2. Calcola media con for.
  3. Decidi se promossi (>6).

Calcolare la Media di N numeri

Con questo esercizio vedremo come utilizzare il costrutto iterativo for. A tal proposito scrivere un programma che calcola la media di N numeri.


<!DOCTYPE html>

<html>
	<head>
		<title>Calcola media di N numeri</title>
	</head>
	
	<body>
		<h1>Calcola la Media</h1>
		<br>
		<label >Quanti numeri vuoi inserire?</label>
		<br>
		<input type="number" id="conta"/>
		<br>
		<br>
		<button onclick="calcolaMedia()">Calcola la Media </button>
		<br>
		<p>La media è: </p>
		<p id="risultato"> </p>
		
		<script>
		
			function calcolaMedia(){
				let n = parseFloat(document.getElementById("conta").value);
				if (isNaN(n)|| n<=0) {
					alert("Errore: Inserire un numero maggiore di zero"); 
					return;
				}
				
				let somma = 0;
				
				for (let i=0; i<n; i++){
					let numero = prompt('Inserisci numero');
					let num = parseFloat(numero);
					somma += num;
					}
				let media = somma/n;
				document.getElementById('risultato').textContent =  media;
			}
			</script>
			
		
	</body>
</html>

Osservazioni:

La funzione NaN (Not-a-Number) è un valore speciale di tipo number che rappresenta un risultato numerico non valido.

La funzione prompt (input da finestra di dialogo), è una funzione globale (da utilizzare solo nel browser) che mostra un pop-up e restituisce una stringa con ciò che l’utente ha digitato, oppure null se ha annullato.