IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Trier un résultat dans un while


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Points : 1
    Points
    1
    Par défaut Trier un résultat dans un while
    Bonjour,

    Je suis en train de concevoir une plateforme en PHP et MySQL, et j'ai actuellement un problème pour ma page de recherche.

    Je m'explique, le "client" rentre une adresse A (on va l'appelé FROM) dans la barre de recherche, il est ensuite redirigé sur une page de résultat.

    J'ai bien mes résultats qui s'affiche, mais je souhaite trier par distance (la distance calculé par l'API de Google Maps Matrix).

    J'ai bien la distance qui s'affiche, mais ils sont pas vraiment trié.

    Je ne sais pas si c'était clair, voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    $DISTANCE_FROM = urlencode($_COOKIE['LOCATION']);
     
    	$REQ_RESULTS = mysqli_query($_DB_CON, 'SELECT * FROM MEALS');
     
    	while($DATA_RESULTS = mysqli_fetch_assoc($REQ_RESULTS))
    	{
    		$DATA_COOK = mysqli_fetch_assoc(mysqli_query($_DB_CON, 'SELECT * FROM USERS WHERE ID_UNIQUE = "'.$DATA_RESULTS['FROM_USER'].'"'));
     
    		$DISTANCE_TO = urlencode(''.$DATA_COOK['FULL_ADRESS'].'');
    		$DISTANCE_DATA = json_decode(file_get_contents('http://maps.googleapis.com/maps/api/distancematrix/json?origins='.$DISTANCE_FROM.'&destinations='.$DISTANCE_TO.'&sensor=false'));
    		$DISTANCE_TIME = 0;
    		$DISTANCE_DISTANCE = 0;
    		foreach($DISTANCE_DATA->rows[0]->elements as $DISTANCE_ROAD) 
    		{
    		   $DISTANCE_TIME      = $DISTANCE_ROAD->duration->text;
    		   $DISTANCE_DISTANCE  = $DISTANCE_ROAD->distance->text;
    		}
     
    		echo $DISTANCE_FROM;
    		echo '<br>';
    		echo $DISTANCE_TO;
    		echo '<br>';
    		echo $DISTANCE_DISTANCE;
    		echo '<br>';
    		echo '<br>';
     
    	}
    Donc, comme dit, $DISTANCE_FROM et récupérer depuis un cookie (pour l'exemple), j'arrive à faire la distance du point A au point B (qui est récupéré pour la variable $DISTANCE_TO qui vient récupérer l'adresse du user 2), qui s'affiche correctement sur les résultats, mais impossible de trouver le moyen de faire afficher la boucle des résultats par un sort ou autre dans cette même boucle.

    En bonus, quand la distance est inférieur à 1 km, il m'affiche des mètres, il faudrait donc les trier de la plus petite à la grande distance (je sais, je me repéte).



    Voilà pour mon problème du soir,

    Bonne fêtes !

  2. #2
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Tu peux ne faire qu'une seule requête SQL avec un INNER JOIN et là tu pourras faire un ORDER BY distance.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * FROM MEALS
    INNER JOIN USERS ON ID_UNIQUE = nom_du_champ_equivalent_dans_MEALS
    ORDER BY nom_du_champ_distance

    Je te conseille de remplacer le * par la liste des champs effectivement utilisés afin de ne pas mettre en mémoire des données inutiles

  3. #3
    Invité
    Invité(e)
    Par défaut
    @badaze
    Si tu as regardé son code, la distance est calculée EN DEHORS de la requête (pas de distance enregistrée)

    Cela dit, on peut effectivement faire une seule requête avec ces 2 là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'SELECT * FROM MEALS'
    'SELECT * FROM USERS WHERE ID_UNIQUE = "'.$DATA_RESULTS['FROM_USER']
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $REQ = "SELECT * FROM MEALS M
       INNER JOIN USERS U
       ON M.FROM_USER = U.ID_UNIQUE
       ";
    $REQ_RESULTS = mysqli_query($_DB_CON, $REQ);
    La solution du tri par distance est de :

    • ne pas faire l'affichage dans le while mais...
    • ...créer un array dans le while, justement pour y inclure la distance calculée.
    • Ensuite, on arrange cet array -> sort().
    • Un foreach de cet array permet ensuite l'affichage voulu.
    Dernière modification par Invité ; 30/12/2017 à 11h28.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Merci de vos réponses à vous deux !

    Effectivement c'est exactement ça que je compte faire !

    Je vais tenter de faire ça et je vous tiens au courant !

    Une fois que j'aurai fait ça, je vais essayer de rajouter des filtres pour filtrer (logique me direz-vous ?).

    Merci encore !

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Comme prévu, de mon côté ça ne marche pas..

    Je n'arrive même pas à afficher mon array.

    J'ai tenté ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    	$REQ = "SELECT * FROM MEALS M
    		INNER JOIN USERS U
    		ON M.FROM_USER = U.ID_UNIQUE
    	";
       $REQ_RESULTS = mysqli_query($_DB_CON, $REQ);
     
     
    	while ($row = mysql_fetch_array($REQ_RESULTS))
    	{	
        	$namesArray[] = array( 
    	        'title' => $row['TITLE'],
    	        'id_unique' => $row['ID_UNIQUE']
    	    );
        }
     
       	foreach($namesArray as $key => $value)
       	{
        	echo $key . " : " . $value . "<br>";
    	}
    Mais ça n'affiche rien au niveau du foreach..

  6. #6
    Invité
    Invité(e)
    Par défaut
    $value est aussi un array.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Je crois que j'ai un peu de mal..

    Après maintes recherches j'ai différents résultats en fonction de ce que je fais.

    Déjà :
    - Je n'arrive pas à faire la requête MySQL pour trouver l'ID_UNIQUE de USERS, en faisant ce que tu as dis rien ne s'affiche,
    - Le foreach doit être dedans ou dehors le while ?

    Voilà ce que j'ai réussi à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    	$REQ_RESULTS = mysqli_query($_DB_CON, 'SELECT * FROM MEALS');
     
    	while($DATA_RESULTS = mysqli_fetch_assoc($REQ_RESULTS))
    	{	
    		$DATA_COOK = mysqli_fetch_assoc(mysqli_query($_DB_CON, 'SELECT * FROM USERS WHERE ID_UNIQUE = "'.$DATA_RESULTS['FROM_USER'].'"'));
     
        	$a = array(
    		    'title' => $DATA_RESULTS['TITLE'],
    		    'id_user' => $DATA_RESULTS['FROM_USER'],
    		    'firstname' => $DATA_COOK['FIRSTNAME'],
    		    'price' => $DATA_RESULTS['PRICE'],
    		    'parts' => $DATA_RESULTS['PARTS']
    		);
     
     
    		foreach ($a as $k => $v) 
    		{
    			echo $a['title'];
    			echo '<br>';
    			echo $a['firstname'];
    			echo '<br>';
    			echo $a['price'];
    			echo '<br>';
    			echo $a['parts'];
    			echo '<br>';
    			echo '<br>';
    		}
    	}
    Mais évidemment ça sort tout en 10 fois (2 MEALS pour 5 array).

    Et la distance vient de la table USERS depuis la colonne FULL_ADRESS.

    En gros je peux récupérer les informations mais il me les multiplies..

    Merci en tout cas de ton aide.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Points : 1
    Points
    1
    Par défaut On y arrive !
    C'est bon, je touche le but !

    J'ai réussi à afficher mes données dans le foreach, cependant je n'arrive pas à trier par distance.

    Effectivement, j'affiche correctement la distance, mais que je fasse sort($a); ou autre, l'ordre d'affichage ne change pas.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    $REQ_RESULTS = mysqli_query($_DB_CON, 'SELECT * FROM MEALS');
     
    	while($DATA_RESULTS = mysqli_fetch_assoc($REQ_RESULTS))
    	{	
    		$DATA_COOK = mysqli_fetch_assoc(mysqli_query($_DB_CON, 'SELECT * FROM USERS WHERE ID_UNIQUE = "'.$DATA_RESULTS['FROM_USER'].'"'));
     
     
    		$DISTANCE_TO = urlencode(''.$DATA_COOK['FULL_ADRESS'].'');
    		$DISTANCE_DATA = json_decode(file_get_contents('http://maps.googleapis.com/maps/api/distancematrix/json?origins='.$DISTANCE_FROM.'&destinations='.$DISTANCE_TO.'&sensor=false'));
    		$DISTANCE_TIME = 0;
    		$DISTANCE_DISTANCE = 0;
    		foreach($DISTANCE_DATA->rows[0]->elements as $DISTANCE_ROAD) 
    		{
    		   $DISTANCE_TIME      = $DISTANCE_ROAD->duration->text;
    		   $DISTANCE_DISTANCE  = $DISTANCE_ROAD->distance->text;
    		}
     
        	$a = array(
    		    'distance' => $DISTANCE_DISTANCE
    		);
     
    		asort($a);
     
    		foreach ($a as $k => $v) 
    		{
    			$PRICE = $DATA_RESULTS['PRICE'];
    			$PRICE = number_format(($PRICE), 2, '.', '');
    			$FROM_CURRENCY = $DATA_RESULTS['CURRENCY'];
     
    			if($FROM_CURRENCY == $TO_CURRENCY)
    				if($TO_CURRENCY == 'USD')
    					$PRICE_CONVERTED = '$ '.$PRICE .'';
    				else
    					$PRICE_CONVERTED = $PRICE .' '. $CURRENCY_SYMBOL[''.$FROM_CURRENCY.''];
    			elseif($TO_CURRENCY == 'USD')
    				$PRICE_CONVERTED = '$ '. round(currencyConverter($FROM_CURRENCY, $TO_CURRENCY, $PRICE), 2);
    			else
    				$PRICE_CONVERTED = round(currencyConverter($FROM_CURRENCY, $TO_CURRENCY, $PRICE), 2) .' '. $CURRENCY_SYMBOL[''.$TO_CURRENCY.''];
     
    			echo '<div class="meal">
    				<div style="background-image:url(themes/'.$_THEME.'/img/img1.jpg)" class="mealImg">
    					<p class="mealPrice">'.$PRICE_CONVERTED.'</p>
    				</div>
    				<div class="mealContent">
    					<a href="#"><h3>'.$DATA_RESULTS['TITLE'].'</h3></a>
    					<p>'.$DATA_RESULTS['DESCRIPTION'].'</p><br>
    					<p class="mealInfo">'.$DATA_COOK['CITY'].'</b></p>
    					<p class="mealInfo">'.$DISTANCE_DISTANCE.'</b></p>
    					<p class="mealInfo">'.$lang['RESULTS_NBR_OF_PART'].' <b>'.$DATA_RESULTS['PARTS'].'</b></p>
    					<p class="mealInfo">'.$lang['RESULTS_FROM'].' <b>16:00</b> '.$lang['RESULTS_TO'].' <b>19:00</b></p>
    					<div class="separator"></div>
    					<a href="#" class="mealProfil">
    						<div class="mealProfilImg" style="background-image:url(themes/'.$_THEME.'/img/Amaury.jpg)"></div>
    						'.$DATA_COOK['FIRSTNAME'].'
    					</a>
    				</div>
    			</div>';
    		}
    	}

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Après maintes recherches je n'arrive toujours pas à faire ce que je souhaite..

    J'ai mis cette partie en stand-by pour ne pas perdre de temps sur le reste.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ce qui te manque, c'est la logique.

    Là, tu ne tries.... qu'une seule donnée à la fois !

    Il faut sortir du 1er while pour pouvoir faire le tri...

    Et remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        	$a = array(
    		    'distance' => $DISTANCE_DISTANCE
    		);
     
    		asort($a);
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        	$a[$DISTANCE_DISTANCE][] = $DATA_RESULTS;
    À vérifier si OK avec un var_dump($a);

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Hello,

    Merci de ta réponse,

    Effectivement ça me parait logique (ça l'est, c'est vrai).

    Je vais essayer de mettre ça au clair et tenter d'y remédier !

    Thanks!

Discussions similaires

  1. Trier des résultats dans un UNION
    Par bndd24 dans le forum Langage
    Réponses: 1
    Dernier message: 11/07/2017, 20h44
  2. Trier les résultats d'un champ dans deux colonnes
    Par alex94130 dans le forum Débuter
    Réponses: 1
    Dernier message: 02/10/2016, 22h42
  3. [AC-2007] Trier un colonne de résultat dans un tableau dynamique croisé
    Par POPR26 dans le forum Access
    Réponses: 2
    Dernier message: 05/04/2016, 10h37
  4. Un seul résultat dans une boucle while
    Par Graphanco dans le forum Langage
    Réponses: 3
    Dernier message: 08/02/2016, 09h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo