Mettre variable dans array pour trie
RésoluJe souhaite récupérer des valeurs d'un enregistrement pour les trier selon un ordre ASC ou DESC.
Je pensais récupérer ces valeurs (A, B, C), les mettre dans un array, pour ensuite afficher cette array dans l'ordre voulu.
Mais on fait comment ?
27 réponses
La discussion porte sur récupérer des valeurs d'un enregistrement et les trier par ordre ASC ou DESC en PHP en utilisant un tableau associatif. Des réponses proposent d’assembler les valeurs A, B, C dans un tableau et d’appeler des fonctions de tri, tout en gérant les cas où certains champs sont vides. Des contraintes techniques sont discutées, notamment l’utilisation de sort sur un tableau d’objets et l’obligation d’individualiser le tri avec une clé comme date_mariage plutôt que d’ordonner par la première colonne. Finalement, le cas pratique évolue vers une approche où l’auteur obtient un tableau structuré et envisage des requêtes supplémentaires, puis remercie l’aide reçue et projette d’ajouter les noms et lieux.
-
Merci TeRMINo, et meilleurs voeux à tous ............... !!!!
-
Pour vérifier si les lignes sont vides, ça fonctionne avec if ($tonarray[$i]['conjoint'] != "").
Par contre, dans les if (!empty($row['num_cj_1'])) {........ (1,2,3 et 4), je veux récupérer des variables propres à 1, 2, 3 ou 4 (date_naissance) et les inscrire dans la boucle for. Comment je fais ??? -
Je peux t'expliquer comment réduire considérablement le nombre de lignes si tu veux mais il faudra encore utiliser une boucle.
Concernant la condition pour vérifier si des lignes sont vides, essaie if(!empty($tonarray[1]))-
Bonjour TeRMiNo,
J'ai réussi:$tonarray = array(); $tonarray[0]=array("date_mariage" => $row['date_mariage_1'] , "conjoint" => $row['num_cj_1'] , "lieu_mariage" => $row['lieu_mariage_1']); $tonarray[1]=array("date_mariage" => $row['date_mariage_2'] , "conjoint" => $row['num_cj_2'] , "lieu_mariage" => $row['lieu_mariage_2']); $tonarray[2]=array("date_mariage" => $row['date_mariage_3'] , "conjoint" => $row['num_cj_3'] , "lieu_mariage" => $row['lieu_mariage_3']); $tonarray[3]=array("date_mariage" => $row['date_mariage_4'] , "conjoint" => $row['num_cj_4'] , "lieu_mariage" => $row['lieu_mariage_4']); sort($tonarray); for($i=0; $i<=3; $i++) { if ($tonarray[$i]['conjoint'] != "") { $query4 = 'SELECT id,nom,prenom,date_naissance,date_dc FROM individus WHERE num_indiv LIKE '.$tonarray[$i]['conjoint'].' '; $result4 = mysql_query($query4) or die(mysql_error()); $row4 = mysql_fetch_array($result4); echo '<tr><td><u>Union</u> : </td>'; ....................
La seule chose qui cloche c'est que je n'arrive pas à trier sur date_mariage (SUBSTRING(date_mariage, -4) ASC). Car là, j'ai l'impression que le tri se fait sur "conjoint". -
-
-
C'est bon, j'ai trouvé .................. !!!!!!
Merci pour tout !
Bonne fêtes et meilleurs voeux !
A ++ -
J'ai fait ça :
if (!empty($row['num_cj_1'])) { $query4 = 'SELECT nom,prenom,date_naissance,date_dc FROM individus WHERE num_indiv LIKE "'.$row['num_cj_1'].'" '; $result4 = mysql_query($query4) or die(mysql_error()); $row4 = mysql_fetch_array($result4); $ident4 = ''.$row4['nom'].' '.$row4['prenom'].''; } if (!empty($row['num_cj_2'])) { $query5 = 'SELECT nom,prenom,date_naissance,date_dc FROM individus WHERE num_indiv LIKE "'.$row['num_cj_2'].'" '; $result5 = mysql_query($query5) or die(mysql_error()); $row5 = mysql_fetch_array($result5); $ident5 = ''.$row5['nom'].' '.$row5['prenom'].''; } if (!empty($row['num_cj_3'])) { $query6 = 'SELECT nom,prenom,date_naissance,date_dc FROM individus WHERE num_indiv LIKE "'.$row['num_cj_3'].'" '; $result6 = mysql_query($query6) or die(mysql_error()); $row6 = mysql_fetch_array($result6); $ident6 = ''.$row6['nom'].' '.$row6['prenom'].''; } if (!empty($row['num_cj_4'])) { $query7 = 'SELECT nom,prenom,date_naissance,date_dc FROM individus WHERE num_indiv LIKE "'.$row['num_cj_4'].'" '; $result7 = mysql_query($query7) or die(mysql_error()); $row7 = mysql_fetch_array($result7); $ident7 = ''.$row7['nom'].' '.$row7['prenom'].''; } $tonarray = array(); $tonarray[0]=array("date_mariage" => $row['date_mariage_1'] , "conjoint" => $ident4 , "lieu_mariage" => $row['lieu_mariage_1']); $tonarray[1]=array("date_mariage" => $row['date_mariage_2'] , "conjoint" => $ident5 , "lieu_mariage" => $row['lieu_mariage_2']); $tonarray[2]=array("date_mariage" => $row['date_mariage_3'] , "conjoint" => $ident6 , "lieu_mariage" => $row['lieu_mariage_3']); $tonarray[3]=array("date_mariage" => $row['date_mariage_4'] , "conjoint" => $ident7 , "lieu_mariage" => $row['lieu_mariage_4']); sort($tonarray); for($i=0; $i<=3; $i++) { if ($tonarray[1] != "") { echo '<tr><td><u>Union</u> : </td>avec '; echo $tonarray[$i]['conjoint']." ".$tonarray[$i]['date_mariage']." ".$tonarray[$i]['lieu_mariage']."<br />"; } }
Ca fonctionne, mais peut-être un peu long et pas très esthétique !
Par contre, j'ai voulu tester si il y avait des requêtes vides (pas de conjoint) en faisant if ($tonarray[1] != ""), mais ça fonctionne pas ! -
Tu n'as pas besoin de remplacer tel que tu le dis.
Tu as $row['num_cj_1'] et à partir de ça tu peux toujours trouver le nom et le prénom grâce à ta requête.
Par contre dans ton select, num_indiv vaut $row['num_cj_1'] ou pas ?
Car si c'est la même valeur tu ne dois pas mettre de LIKE mais un = -
OKKKK !!! J'ai trouvé ...........
GENIAL !!!! Un grand merci pour ton aide !!!!!
Me reste plus quà trouver l'équivalence de num_cj_1, num_cj_2,num_cj_3 et num_cj_4 dans la table en, faisant :if (!empty($row['num_cj_1'])) { $query4 = 'SELECT nom,prenom FROM individus WHERE num_indiv LIKE "'.$row['num_cj_1'].'" '; $result4 = mysql_query($query4) or die(mysql_error()); $row4 = mysql_fetch_array($result4); }
Mais comment remplacer
"conjoint" => $row['num_cj_1']
par
$row4['nom'] $row4['prenom'] -
Voici ce que j'ai écrit :
$query = 'SELECT * FROM individus WHERE id = "'.$id.'"'; $result = mysql_query($query) or die(mysql_error()); $row = mysql_fetch_array($result); $tonarray = array(); $tonarray[0]=array("date_mariage" => '.$row['date_mariage_1'].' , "conjoint" => '.$row['num_cj_1'].', "lieu_mariage" => '.$row['lieu_mariage_1'].'); $tonarray[1]=array("date_mariage" => '.$row['date_mariage_2'].' , "conjoint" => '.$row['num_cj_2'].', "lieu_mariage" => '.$row['lieu_mariage_2'].'); $tonarray[2]=array("date_mariage" => '.$row['date_mariage_3'].' , "conjoint" => '.$row['num_cj_3'].', "lieu_mariage" => '.$row['lieu_mariage_3'].'); $tonarray[3]=array("date_mariage" => '.$row['date_mariage_4'].' , "conjoint" => '.$row['num_cj_4'].', "lieu_mariage" => '.$row['lieu_mariage_4'].'); for($i=0; $i<=3; $i++) { echo $tonarray[$i]['date_mariage']." ".$tonarray[$i]['conjoint']." ".$tonarray[$i]['lieu_mariage']."<br />"; } echo "<br />"; sort($tonarray); for($i=0; $i<=3; $i++) { echo $tonarray[$i]['date_mariage']." ".$tonarray[$i]['conjoint']." ".$tonarray[$i]['lieu_mariage']."<br />"; }
Et j'ai en reour :
Parse error: syntax error, unexpected T_STRING, expecting ')' sur la ligne $tonarray[0]=..........
Je pense que c'est un problème d'écriture de variable !? J'ai essayé plusieurs possibilités, mais rien à faire !
Je n'ai donc pas encore pu voir le résultat, mais pourquoi fais-tu 2 boucles for ? -
J'ai exactement ce qu'il te faut.
Un tableau imbriqué dans un autre tableau.
Je vais te donner un petit exemple que tu lanceras et tu n'auras plus qu'à l'adapter pour toi.
<?php $tonarray = array(); $tonarray[0]=array("fruit" => "orange", "chiffre"=>"2"); $tonarray[1]=array("fruit" => "banane", "chiffre"=>"3"); $tonarray[2]=array("fruit" => "ananas", "chiffre"=>"6"); for($i=0; $i<=2; $i++){ echo $tonarray[$i]['fruit']." ".$tonarray[$i]['chiffre']."<br />"; } echo "<br />"; sort($tonarray); for($i=0; $i<=2; $i++){ echo $tonarray[$i]['fruit']." ".$tonarray[$i]['chiffre']."<br />"; } ?>
Essaye de voir ce que ça te donne et si tu ne comprends pas je t'expliquerais en détail.
Il est important que tu comprennes par toi même pour que tu puisse le reproduire par la suite.
En fait un tableau imbriqué te permet d'associer plusieurs valeurs (ici chiffre) à une valeur de départ (ici fruit). Ce qui fait que lorsque tu tries ton tableau, les valeurs resteront associées. -
En fait, dans mon enregistrement, j'ai 4 champs (date1, date2, date3 et date4). J'ai en plus 4 autres champs qui correspondent au personnage lié à la date (num_cj_1, num_cj_2, num_3 et num_cj_4). Et j'ai encore 4 autres champs liés à la date (lieu_1, lieu_2, lieu_3 et lieu_4).
Donc, quand j'affiche date2, j'affiche avec num_cj_2 et lieu_2.
Si après j'affiche date1, j'affiche num_cj_1 et lieu_1 .................... -
Donc si j'ai bien compris tu as une table qui a 4 champs (date1, date2, date3, date4) et ce sont ces dates que tu récupères a chaque fois et que tu mets dans ton tableau c'est ça ?
Si c'est ça je ne vois qu'une solution, effectuer un select dans ta table du lieu et du nom pour lequel on trouve cette date.
Cependant, si tu as deux fois la même date pour plusieurs noms et plusieurs lieux ça risque de poser problème et il faudra gérer le cas en effectuant d'autres requêtes.
exemple: 11 janvier 2013 correspond à événement1 et à événement2 en même temps. Il faut que tu fasses ton select sur le premier résultat de la table, tu affiches ce résultat avec la date, tu parcours ton tableau et tu tombes sur la même date puisqu'elle est présente pour deux événements différents, puis tu réalises ton select sur le deuxième résultat
Est-ce que tu as compris ? -
GENIAL !!! Merci beaucoup ! Tu m'as été d'une grande aide, et merci aussi pour ta patience.
Me reste plus qu'à parfaire un tableau et à y rajouter les noms et les lieux qui vont avec les dates !
Pour cela, comme je ne peux le faire apparaitre dans le tableau ($tonarray[$compteur] = $row....), je vais être obligé de refaire un select ? -
Bonjour,
Tu ne dois pas utiliser ksort() pour classer ton tableau par ordre alphabétique mais simplement sort().
La, le morceau de code ne sert qu'à remplir ton tableau. Pour l'afficher il faut faire ceci:
for($i=0; $i<=$compteur; $i++){ echo $tonarray[$i]."<br />"; }
Tu auras ainsi toutes tes valeurs écrites les unes en dessous des autres dans l'ordre alphabétique -
OK !
$query = 'SELECT * FROM individus WHERE id = "'.$id.'"';
$result = mysql_query($query) or die(mysql_error());
$compteur = -1;
$tonarray = array();
while($row = mysql_fetch_array($result))
{
$compteur++;
$tonarray[$compteur] = $row['date_mariage_1'];
$compteur++;
$tonarray[$compteur] = $row['date_mariage_2'];
$compteur++;
$tonarray[$compteur] = $row['date_mariage_3'];
$compteur++;
$tonarray[$compteur] = $row['date_mariage_4'];
}
ksort($tonarray);
foreach ($tonarray as $key => $row)
{
echo ?????????????;
Et je fais comment pour afficher le résultat puisque je n'ai pas un nom de variable fixe ? -
Non puisque tu incrémentes ton compteur entre chaque champs. Essaye et tu verras par toi même.
-
De cette façon, tu ne vas pas effacer $tonarray[$compteur] à chaque itération ???
-
Je ne comprends pas bien...
A chaque ligne de ta table tu as 4 champs à mettre dans le tableau ?
Exemple: ta table contient les champs "A", "B", "C", "D"
Tu dois mettre les 4 champs dans le tableau à chaque ligne ?
Si c'est ça:
$sql = "SELECT * FROM ..."; $result = mysql_query($sql); $compteur = -1; $tonarray = array(); while($row = mysql_fetch_array($result)){ $compteur++; $tonarray[$compteur] = row['nom_du_champ_de_la_table']; $compteur++; $tonarray[$compteur] = row['nom_du_champ_de_la_table2']; $compteur++; $tonarray[$compteur] = row['nom_du_champ_de_la_table3']; $compteur++; $tonarray[$compteur] = row['nom_du_champ_de_la_table4']; } -
Je vois ce que tu me présentes, mais j'ai oublié de te dire que 'nom_du_champ_de_la_table' a un nom différent.
J'ai 4 champs de l'enregistrement à mettre dans l'ordre, mais ils ne portes pas le même nom !!! -
Re !
Donc pour faire ça:
$sql = "SELECT * FROM ..."; $result = mysql_query($sql); $compteur = -1; $tonarray = array(); while($row = mysql_fetch_array($result)){ $compteur++; $tonarray[$compteur] = row['nom_du_champ_de_la_table']; }
Voila comment avoir un beau tableau avec le champ de la table que tu désires. Si tu veux plus d'explications n'hésite pas. -
SELECT * FROM matable WHERE id=$id
- 1
- 2