Correzione Prova Formativa - Recensioni Libro

<?php
define("STELLE_MIN", 1);
define("STELLE_MAX", 5);
const SOGLIA = 4;

$catalogo = [
    "Il nome della rosa"      => [5, 4, 5, 4],
    "I promessi sposi"        => [3, 2, 3, 2],
    "Il piccolo principe"     => [5, 5, 4],
    "La coscienza di Zeno"    => [2, 1, 2],
    "Pinocchio"               => [4, 3, 4, 2],
    "Il signore degli anelli" => [5, 4, 4, 5, 3]
];

$messaggio = "";

// 1. Nuova recensione (POST)
if ($_SERVER['REQUEST_METHOD'] == "POST") {
    $titolo = trim($_POST['titolo']);
    $stelle = (int) $_POST['stelle'];   // "tre" o "" diventano 0

    if ($titolo == "" || $stelle < STELLE_MIN || $stelle > STELLE_MAX) {
        $messaggio = "Errore: serve un titolo e un voto da 1 a 5.";
    } else {
        $catalogo[$titolo][] = $stelle;  // va bene sia per libri nuovi che esistenti
        $messaggio = "Recensione salvata per $titolo.";
    }
}

// 2. Filtro (GET)
$filtro = 0;
if (isset($_GET['min'])) {
    $filtro = (float) $_GET['min'];   // (float) tiene i decimali: "4.5" resta 4.5
    if ($filtro < STELLE_MIN || $filtro > STELLE_MAX) {
        $messaggio = "Filtro non valido.";
        $filtro = 0;
    }
}

// 3. Medie e totale recensioni
$medie = [];
$recensioni_totali = 0;
foreach ($catalogo as $libro => $voti) {
    $medie[$libro] = round(array_sum($voti) / count($voti), 2);
    $recensioni_totali += count($voti);
}
arsort($medie);              // dalla media più alta alla più bassa
$titoli = array_keys($medie);
$migliore = $titoli[0];      // dopo l'ordinamento il primo titolo è il migliore
?>
<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="UTF-8">
    <title>Libreria online</title>
</head>
<body>
    <h1>Libreria online</h1>

    <h2>Lascia una recensione</h2>
    <form method="post">
        Titolo del libro: <input type="text" name="titolo"><br>
        Stelle (da 1 a 5): <input type="text" name="stelle"><br>
        <input type="submit" value="Invia">
    </form>

    <h2>Filtra il catalogo</h2>
    <form method="get">
        Media minima: <input type="text" name="min">
        <input type="submit" value="Filtra">
    </form>

    <p><?php echo $messaggio; ?></p>

    <h2>Catalogo</h2>
    <table border="1">
        <tr>
            <th>Titolo</th>
            <th>Stelle</th>
            <th>Recensioni</th>
            <th>Media</th>
            <th>Giudizio</th>
        </tr>
        <?php
            foreach ($medie as $libro => $media) {
                if ($media >= $filtro) {
                    if ($media < 3) {
                        $giudizio = "Sconsigliato";
                    } elseif ($media < SOGLIA) {
                        $giudizio = "Buono";
                    } else {
                        $giudizio = "Consigliato";
                    }
                    echo "<tr>";
                    echo "<td>$libro</td>";
                    echo "<td>" . implode(", ", $catalogo[$libro]) . "</td>";
                    echo "<td>" . count($catalogo[$libro]) . "</td>";
                    echo "<td>$media</td>";
                    echo "<td>$giudizio</td>";
                    echo "</tr>";
                }
            }
        ?>
    </table>

    <h2>Riepilogo</h2>
    <p>Numero libri: <?php echo count($catalogo); ?></p>
    <p>Recensioni totali: <?php echo $recensioni_totali; ?></p>
    <p>Libro migliore: <?php echo $migliore; ?></p>

    <hr>
    <p>Metodo della richiesta: <?php echo $_SERVER['REQUEST_METHOD']; ?></p>
</body>
</html>