Signaler

Trie sur tableau(x)

Posez votre question t671 1141Messages postés lundi 25 février 2008Date d'inscription 4 septembre 2017 Dernière intervention - Dernière réponse le 20 juin 2017 à 11:47 par t671
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
Utile
+0
plus moins
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.
http://www.commentcamarche.net/faq/43261-php-l-extension-mysql-est-obsolete#top

.

Donnez votre avis
Utile
+0
plus moins
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 ....... !!!???
jordane45 18302Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 20 septembre 2017 Dernière intervention - 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.
Répondre
t671 1141Messages postés lundi 25 février 2008Date d'inscription 4 septembre 2017 Dernière intervention - 20 juin 2017 à 11:47
OK ! Merci à toi ! Je vais m'atteler à la tâche, tout doucement .............
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !