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>