Trie sur tableau(x)

Fermé
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 - Modifié le 18 juin 2017 à 18:46
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 - 20 juin 2017 à 11:47
Bonjour,

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:

2 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
18 juin 2017 à 21:26
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:
$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

.

0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
Modifié le 20 juin 2017 à 11:32
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 ....... !!!???
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
20 juin 2017 à 11:40
A quoi cela te sert d'avoir

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.
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11 > jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024
20 juin 2017 à 11:47
OK ! Merci à toi ! Je vais m'atteler à la tâche, tout doucement .............
0