Trie sur tableau(x)
t671
Messages postés
1476
Date d'inscription
Statut
Membre
Dernière intervention
-
t671 Messages postés 1476 Date d'inscription Statut Membre Dernière intervention -
t671 Messages postés 1476 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J’ai plusieurs tableau (array). Un array correspond aux divers éléments contenus dans un enregistrement
Puis je trie mon tableau, et je veux afficher les enregistrements en les classant dans l’ordre par rapport aux « $row['date_mariage »
Mais l’affichage final n’est pas correct ! Il n’est pas l’ordre de « "'.$tonarray[$i]['date_mariage'].'", -4 ».
Ou est l'erreur ?
Merci
J’ai plusieurs tableau (array). Un array correspond aux divers éléments contenus dans un enregistrement
$tonarray[0]=array("mariage" => $marg_1 ,"date_mariage" => $row['date_mariage_1'] , "conjoint" => $row['num_cj_1']; $tonarray[1]=array("mariage" => $marg_2 ,"date_mariage" => $row['date_mariage_2'] , "conjoint" => $row['num_cj_2'] ; $tonarray[2]=array("mariage" => $marg_3 ,"date_mariage" => $row['date_mariage_3'] , "conjoint" => $row['num_cj_3']; $tonarray[3]=array("mariage" => $marg_4 ,"date_mariage" => $row['date_mariage_4'] , "conjoint" => $row['num_cj_4'];
Puis je trie mon tableau, et je veux afficher les enregistrements en les classant dans l’ordre par rapport aux « $row['date_mariage »
asort($tonarray); for($i=0; $i<=3; $i++) { if ($tonarray[$i]['conjoint'] != "") { echo '<tr><td height=20></td></tr>'; $query4 = 'SELECT id,num_indiv,famille,nom,prenom,surnom,date_naissance,date_dc FROM individus WHERE num_indiv = "'.$tonarray[$i]['conjoint'].'" ORDER BY (SUBSTRING("'.$tonarray[$i]['date_mariage'].'", -4)) ASC'; $result4 = mysql_query($query4) or die(mysql_error()); $row4 = mysql_fetch_array($result4);
Mais l’affichage final n’est pas correct ! Il n’est pas l’ordre de « "'.$tonarray[$i]['date_mariage'].'", -4 ».
Ou est l'erreur ?
Merci
A voir également:
- Trie sur tableau(x)
- Tableau word - Guide
- Trier un tableau excel - Guide
- Site x - Guide
- Sites X : Pornhub, YouPorn et Redtube sont de nouveau accessibles en France - Guide
- Tableau ascii - Guide
2 réponses
Bonjour,
Première chose ..... rassure moi..... les DATES dans ta BDD sont bien dans des champs DATE (ou DATETIME ou TIMESTAMP) ??? tu n'aurais quand même pas fait l'erreur de les mettre dans des champs text (ou varchar ) ??
Puis... le ORDER BY.. ça s'applique sur le NOM D'UN CHAMP de ta bdd... pas sur une "valeur" !
Ensuite....
Au lieu de faire une boucle FOR ... pourquoi ne pas simplement utiliser, dans ta requête.. un IN ?
Par exemple:
NB: J'ai l'impression que tu fais une requête .... dans une autre requête ....
Il serait mieux de ne faire qu'une seule requête en utilisant des JOINTURES ! (mais sans voir le reste de ton code... impossible de t'en dire plus )
NB² : Tu utilises l'ancienne extension Mysql ... considérée comme obsolète !
Tu devrais passer à PDO ou Mysqli.
https://www.commentcamarche.net/faq/43261-php-l-extension-mysql-est-obsolete#top
.
Première chose ..... rassure moi..... les DATES dans ta BDD sont bien dans des champs DATE (ou DATETIME ou TIMESTAMP) ??? tu n'aurais quand même pas fait l'erreur de les mettre dans des champs text (ou varchar ) ??
Puis... le ORDER BY.. ça s'applique sur le NOM D'UN CHAMP de ta bdd... pas sur une "valeur" !
Ensuite....
Au lieu de faire une boucle FOR ... pourquoi ne pas simplement utiliser, dans ta requête.. un IN ?
Par exemple:
$lstConjoints = array(); foreach($tonarray as $C){ if(!empty($C['conjoint'])){ $lstConjoints[] = $C['conjoint']; } } $strIn = join("','",$lstConjoints); $query4 = "SELECT id,num_indiv, famille, nom, prenom, surnom, date_naissance, date_dc FROM individus WHERE num_indiv IN('$strIn') ORDER BY nom_du_champ_date ASC "; $result4 = mysql_query($query4) or die(mysql_error()); //pense à remplacer : nom_du_champ_date par le Nom de ton champ date de ta table //on boucle sur les résultats while ($row4 = mysql_fetch_array($result4)){ echo "<tr> <td style='height:20px'>".$row4['id']."</td> <td style='height:20px'>".$row4['num_indiv']."</td> <td style='height:20px'>".$row4['famille']."</td> </tr>"; }
NB: J'ai l'impression que tu fais une requête .... dans une autre requête ....
Il serait mieux de ne faire qu'une seule requête en utilisant des JOINTURES ! (mais sans voir le reste de ton code... impossible de t'en dire plus )
NB² : Tu utilises l'ancienne extension Mysql ... considérée comme obsolète !
Tu devrais passer à PDO ou Mysqli.
https://www.commentcamarche.net/faq/43261-php-l-extension-mysql-est-obsolete#top
.
Merci jordane 45 pour ton aide !
Les DATES ds la BDD ne sont pas au format DATETIME ou TIMESTAMP. Car certaines s'écrivent "JJ mois AAAA", ou "vers AAAA", ou "avant AAAA", ou "vers mois AAAA", ou "entre AAAA et AAAA" ..........
Donc, c'est pour cela que je fais un trie sur les 4 derniers caractères qui sont obligatoirement AAAA.
Un enregistrement comporte les champs "date_mariage_1", "date_mariage_2", "date_mariage_3", "date_mariage_4" qui n’apparaissent pas obligatoirement dans l'ordre dans la BDD. Donc si les champs existent (1, 2, 3 ou/et 4), je les trie sur AAAA pour les afficher dans l'ordre.
Il faudrait effectivement que je passe à Msqli. Mais ça m'oblige à revoir tout mon script qui comporte 736 lignes ..........
Avant, celui que j'ai actuellement fonctionnait très bien ....... !!!???
Les DATES ds la BDD ne sont pas au format DATETIME ou TIMESTAMP. Car certaines s'écrivent "JJ mois AAAA", ou "vers AAAA", ou "avant AAAA", ou "vers mois AAAA", ou "entre AAAA et AAAA" ..........
Donc, c'est pour cela que je fais un trie sur les 4 derniers caractères qui sont obligatoirement AAAA.
Un enregistrement comporte les champs "date_mariage_1", "date_mariage_2", "date_mariage_3", "date_mariage_4" qui n’apparaissent pas obligatoirement dans l'ordre dans la BDD. Donc si les champs existent (1, 2, 3 ou/et 4), je les trie sur AAAA pour les afficher dans l'ordre.
Il faudrait effectivement que je passe à Msqli. Mais ça m'oblige à revoir tout mon script qui comporte 736 lignes ..........
Avant, celui que j'ai actuellement fonctionnait très bien ....... !!!???
A quoi cela te sert d'avoir
Du moins.. l'information "textuelle ( avant , vers.. )" ?
Si tu voulais disposer des infos : AVANT LE (par exemple) tu faisais un champ "date_before" ... au format dateTime ! Pas besoin de stocker le "texte" ....
Oh mon dieu .... 736 lignes ??? mais c'est énorme... ( non je plaisante... c'est rien du tout.... et il est préférable de faire la modification maintenant au lieu d'attendre d'arriver 2000 lignes !!! )
J'ai l'impression que la structure de tes tables n'est pas correctement pensé. Ne serait-ce que le type d'information qui tu y stockes et les formats choisi (comme pour les dates....).
Je te laisse remettre de l'ordre (aussi bien dans l'utilisation de mysqli) dans ton code et tes tables avant de revenir vers nous.
En l'état c'est trop "brouillon" pour pouvoir correctement te répondre.
Car certaines s'écrivent "JJ mois AAAA", ou "vers AAAA", ou "avant AAAA", ou "vers mois AAAA", ou "entre AAAA et AAAA" ..........
Du moins.. l'information "textuelle ( avant , vers.. )" ?
Si tu voulais disposer des infos : AVANT LE (par exemple) tu faisais un champ "date_before" ... au format dateTime ! Pas besoin de stocker le "texte" ....
l faudrait effectivement que je passe à Msqli. Mais ça m'oblige à revoir tout mon script qui comporte 736 lignes ..........
Oh mon dieu .... 736 lignes ??? mais c'est énorme... ( non je plaisante... c'est rien du tout.... et il est préférable de faire la modification maintenant au lieu d'attendre d'arriver 2000 lignes !!! )
J'ai l'impression que la structure de tes tables n'est pas correctement pensé. Ne serait-ce que le type d'information qui tu y stockes et les formats choisi (comme pour les dates....).
Je te laisse remettre de l'ordre (aussi bien dans l'utilisation de mysqli) dans ton code et tes tables avant de revenir vers nous.
En l'état c'est trop "brouillon" pour pouvoir correctement te répondre.