2020 || (int) $_GET["annee"] < 2016) { echo "L'année entrée n'est pas valide"; die(); } $rangMoyen = 0; // Variable donnant le rang utilisé pour calculer le tableau des choix, et servant aussi au classement affiché $sqlLimiteBasse = "SELECT * FROM notes_rang WHERE annee = :annee AND note >= :note ORDER BY classement DESC LIMIT 1"; $sqlLimiteHaute = "SELECT * FROM notes_rang WHERE annee = :annee AND note <= :note ORDER BY classement LIMIT 1"; $reqLimBasse = $db->prepare($sqlLimiteBasse); $reqLimBasse->execute([ "annee" => $_GET["annee"], "note" => $_GET["note"] ]); if ($reqLimBasse->rowCount() === 0) { // Pas de note au dessus de la note entrée => Forcément 1er $rangMoyen = 1; } else { $reqLimiteHaute = $db->prepare($sqlLimiteHaute); $reqLimiteHaute->execute([ "annee" => $_GET["annee"], "note" => $_GET["note"] ]); $rangBasArray = $reqLimBasse->fetch(PDO::FETCH_ASSOC); if ($reqLimiteHaute->rowCount() === 0) { // Pas de note en dessous => Forcément dernier $rangMoyen = $rangBasArray["classement"] + 10; } else { // Note entre 2 classements connus de la DB $rangHautArray = $reqLimiteHaute->fetch(PDO::FETCH_ASSOC); // Ligne non utilisée car révèle les points utilisés (entre xxx et yyy) sont connus // $rangText = "Entre ".$rangBasArray["classement"]." et ".$rangHautArray["classement"]; $rangMoyen = ((int) $rangBasArray["classement"] + (int) $rangHautArray["classement"]) / 2; $rangMoyen = (int) $rangMoyen; } } /******************************** * CALCUL DU TABLEAU DES CHOIX ********************************/ // HTML renvoyé au site $html = <<

Tableau de classement pour le rang {$rangMoyen}

Rang estimé pour la note {$_GET["note"]}/10800 : {$rangMoyen}

Chaque nombre dans chaque case correspond au nombre d'années où ce choix était dispo au classement rentré

EOF; $html .= "

Résultats

"; // On va récupérer tous les rangs limited dispo triés par idChoix $reqRL = $db->query("SELECT idChoix, annee, rangLimite FROM dataset"); $rangLimites = $reqRL->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC); // Récupération des datasets $specialityDatasetAbrev = getCsvToArrayKeyValue($_SETTINGS["datasetFolder"]."/liste_specialites_abrev.csv"); $specialityDataset = getCsvToArrayKeyValue($_SETTINGS["datasetFolder"]."/liste_specialites.csv"); $cityDataset = getCsvToArrayKeyValue($_SETTINGS["datasetFolder"]."/liste_villes.csv"); $inputClassement = $rangMoyen; // Calcul et affichage des données // Affichage de la 1ère ligne = Titre des colonnes $html .= ""; foreach ($specialityDatasetAbrev as $specialityName) { $html .= ""; } $html .= ""; // Affichage de la suite du tableau avec le calcul foreach ($cityDataset as $cityId => $cityName) { // On gère la séparation des différentes régions entre elles (représentées dans le csv villes par les lignes XX_:XX) // La notation des lignes de séparation est sous forme XX_x car si on laissait XX, la fonction getCsvToArrayKeyValue // ne retourne la position que pour la 1ère occurence de XX;XX // La manière de fix ça de manière la plus opti et sale, c'est de faire un substr et de tester les 2 premiers charactères // si ils sont égaux à XX, on fait une séparation // TODO : Faire un parseur csv qui prend en compte chaque ligne du csv dans l'ordre du fichier if (strpos($cityId, "XX") !== FALSE) { $html .= ""; foreach ($specialityDatasetAbrev as $specialityName) { $html .= ""; } $html .= ""; continue; } $html .= ""; foreach ($specialityDatasetAbrev AS $specialityId => $specialityName) { $idChoice = "0".$cityId.$specialityId; if (!isset($rangLimites[$idChoice])) { $nbAnneePropose = 0; $nbPossibleAnneePropose = 0; } else { $nbAnneePropose = count($rangLimites[$idChoice]); $nbPossibleAnneePropose = 0; foreach ($rangLimites[$idChoice] as $rangLimite) { if ((int) $rangLimite["rangLimite"] >= $inputClassement) {$nbPossibleAnneePropose++;} } } // Affichage de la cellule $html .= ""; } $html .= ""; } $html .= "
".$specialityName."
".$specialityName."
".$cityName." $nbPossibleAnneePropose && $nbPossibleAnneePropose === 1): $html .= "last-choice"; break; case ($nbAnneePropose > $nbPossibleAnneePropose && $nbPossibleAnneePropose !== 1): $html .= "half-choices"; break; case ($nbAnneePropose === $nbPossibleAnneePropose): $html .= "all-choices"; break; } $html .= "\">"; if ($nbPossibleAnneePropose > 0) { $html .= $nbPossibleAnneePropose; } $html .= "

"; // Affichage du HTML demandé echo $html; } else { echo "Valeurs d'année et/ou note incorrecte."; }