Page 1 sur 1

Classement et rang

Posté : 04 oct. 2022, 17:26
par JP54
Bonjour,
Je suis en train de faire un fichier qui compare la température moyenne d'octobre 2022 par rapport à la température moyenne de tous les mois d'octobre depuis le début de mes relevés en 2004. Je voudrais mettre dans un tableau la température du mois et le rang par rapport au autres mois d'octobre.
Pour ce faire, j'ai créé à l'aide d'une requête un classement de toute les températures moyennes des mois d'octobre par ordre décroissant puis avec des conditions j'indique le rang de la température du mois. Mon fichier est commandé par un monthpicker afin de pouvoir sélectionné les moi et l'année de mon choix.
Mon code

Code : Tout sélectionner

<?php
$i = 1;
$derniere_temperature =  -1;
	$sql = "SELECT Moy_T FROM noaa_mois WHERE Mois=$month ORDER BY Moy_T DESC"; 
if ($res = mysqli_query($conn, $sql)) { 
    if (mysqli_num_rows($res) > 0) { 
        while ($row = mysqli_fetch_array($res)) {
			if($derniere_temperature == $row['Moy_T'])
			{
				$y++;
				$classement = ($i - $y);
			}
			else{
				$y = 0;
				$classement = $i;
			};							
 				if(($temp_moy_mois == $row['Moy_T']) and ($classement == 1)) echo '1er record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==2)) echo '2ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==3)) echo '3ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==4)) echo '4ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==5)) echo '5ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==6)) echo '6ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==7)) echo '7ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==8)) echo '8ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==9)) echo '9ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==10)) echo '10ème record';
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==11)) echo '11ème record';				
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==12)) echo '12ème record';				
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==13)) echo '13ème record';				
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==14)) echo '14ème record';				
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==15)) echo '15ème record';				
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==16)) echo '16ème record';				
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==17)) echo '17ème record';				
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==18)) echo '18ème record';				
				else if(($temp_moy_mois == $row['Moy_T']) and ($classement ==19)) echo '19ème record';								
				
			$i++;
			$derniere_temperature = $row['Moy_T'];
	    }		
        mysqli_query($conn, $sql); 
    } 
} 
mysqli_close($conn); 
?>

Moy_T est la température moyenne des mois d'octobre dans la table noaa_mois.
la varible $month est le mois que je sélectionne dans le monthpicker.
La variable $temp_moy_mois est la température moyenne du mois d'octobre 2022.
Avec ce code, mon fichier fonctionne.
Mais j'ai rencontré un problème avec le mois de février 2011. Le mois de février 2011 et le mois de février 2008 ont la même moyenne 4.44°C

Image

Févier 2011 et février 2008 sont au 9ème rang donc le 9ème record. Mais le problème, dans mon tableau s'affiche deux fois 9ème record.

Image

Donc mon code fonctionne, mais pour les mois avec des températures identiques. Comment puis-je faire pour n'avoir qu'un seul rang dans mon tableau même en cas de températures identiques. j'ai lu qu'on pouvait faire un requête pour fair un classement comme je l'ai et une sous requête pour déterminé le rang, mais je ne suis pas assez calé en php pour faire ce genre de chose.
Des idées?

Pascal

Re: Classement et rang

Posté : 08 oct. 2022, 11:01
par PascalWMR
Salut Pascal

Je comprend pas trop ton truc là.

Tu veux sortir quoi?
Un tableau complet ou uniquement le rang d'un mois dans un tableau?

A+
Pascal

Re: Classement et rang

Posté : 08 oct. 2022, 11:49
par PascalWMR
Re

Tiens teste ça Pascal
https://www.monsite-meteo.eu//ScriptsTe ... ngJP54.php

Dans ce script, je teste le mois de janvier de cette année.
Ça tombe bien puisque il a la même température moyenne que 2015.
Également chez moi, janvier 2012 et 2016 ont aussi les mêmes températures moyennes.

Donc dans les classements, tu peux voir qu'il n'y a pas de 5ème place (puisque deux 4ème) ni de 7ème (puisque deux 6ème)

Voila le code

Code : Tout sélectionner

<?php
require ('../Scripts/PHP/mysqli_connect.php');
$tabmois = array("Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre");
$i=0;
$Rang[]=0;
$RangTest=0;
$AnEnCour=date("Y");
$sql="SELECT Moy_T, Annee, Mois FROM noaa_mois WHERE Mois=01 ORDER BY 1 DESC, 2 ASC";
$query = mysqli_query($conn,$sql);                  
while ($list=mysqli_fetch_array($query)) {
	$TmoyDuMois[$i]=$list['Moy_T']*1;
	$AnDuTmoy[$i]=$list['Annee']*1;
	$MoisDuTmoy[$i]=$list['Mois']*1;
	if($i>0 && $TmoyDuMois[$i] == $TmoyDuMois[$i-1]){
		$Rang[$i]= $Rang[$i-1];
	} else {
		$Rang[$i]= $i+1;
	}
	// le if ci-dessous sert à extraire le mois voulu de l'année en cours
	if($AnDuTmoy[$i]== $AnEnCour){
		$MoisTest='Mois de '.$tabmois[$MoisDuTmoy[$i]-1].' '.$AnDuTmoy[$i].'<br>Moyenne du mois : '.$TmoyDuMois[$i].'°C<br>Classement : '.$Rang[$i].'ème record.';
	}
	echo('Année : '.$AnDuTmoy[$i].' Température moyenne : '.$TmoyDuMois[$i].' Rang :'.$Rang[$i].'<BR>');
	$i++;
}
	echo('<br>'.'<br>'.'Par exemple pour tester le mois de Janvier de cette année.<br>En plus ça tombe bien puique chez moi 2012 et 2016 on la même temp moyenne comme 2015 et 2022<br>');
	echo($MoisTest);
mysqli_free_result($query);
mysqli_close($conn);	

?>
Edit: J'ai légèrement modifié la méthode pour déterminer le rang.
En effet, avec la 1ère méthode ($Rang[$i]=$i) cela ne fonctionnait que si seulement 2 années consécutives avait la même température moyenne.
Avec $Rang[$i]= $Rang[$i-1] le rang reste le même tant que la température moyenne ne change pas.

Re: Classement et rang

Posté : 08 oct. 2022, 11:54
par JP54
Bonjour Pascal,
Je veux uniquement le rang dans le tableau suivant le mois et l’année que je sélectionne.
Je ne suis pas à la maison je te réponds de mon téléphone, je test en fin de journée
Pascal

Re: Classement et rang

Posté : 08 oct. 2022, 17:14
par JP54
Je viens de tester ton code, il fonctionne parfaitement. Qu'il n'y ai pas de 5ème dans ton exemple, c'est tout à fait normal vu qu'il deux 4ème et de toute façon c'est comme ça que se font les classements.
C'est tout à fait ce que je voulais, maintenant en février 2011 ou février 2008, je n'ai qu'un rang qui s'affiche dans mon tableau, c'est parfait.

Image

Par contre tu peux me donner quelques explications sur le code. J'ai un petite question sur la requête, pourquoi

Code : Tout sélectionner

ORDER BY 1 DESC, 2 ASC

Re: Classement et rang

Posté : 08 oct. 2022, 17:24
par PascalWMR
Re

Pascal regarde bien car on était sur le forum e même temps et j'ai modifié mon code.

Code : Tout sélectionner

SELECT Moy_T, Annee, Mois FROM noaa_mois WHERE Mois=01 ORDER BY 1 DESC, 2 ASC
1 DESC, 2 ASC c'est comme Moy_T DESC, Annee ASC
Le résultat de la requête doit être trié
1 DESC ==> Température par ordre décroissant et
2 ASC ==> Année par ordre croissant

C'est plus compact. Moins de code = Vitesse accrue.
C'est une habitude à prendre pour diminuer la longueur du code

A+
Pascal

Re: Classement et rang

Posté : 08 oct. 2022, 17:30
par JP54
Ok Pascal, j'ai bien compris, je prend ta remarque en compte pour mes prochaines requêtes du même type.
Je te remercie beaucoup pour ton aide
Bon WE