Tri tableau
Résolu
t671
Messages postés
1476
Date d'inscription
Statut
Membre
Dernière intervention
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
J'ai un tableau
Le format de la date de mariage est généralement JJ MM AAAA. Mais elle peut aussi être sous forme "Avant AAAA" ou "Après AAAA" ou "Vers AAAA".
Je récupère les 4 derniers caractères de date_mariage qui correspondent à l'année du mariage.
Comment afficher les éléments du tableau par ordre croissant en fonction de ces 4 derniers caractères.
Merci
J'ai un tableau
$tonarray = array(); if (!empty($row['date_mariage_1'])) { $marg_1 = substr($row['date_mariage_1'], -4); $date_marg1 = explode (" ",$row['date_mariage_1']); if ($date_marg1[0] == "Avant") { $marg_1 = $marg_1 - 1 ; } if ($date_marg1[0] == "Après" || $date_marg1[0] == "Entre" || $date_marg1[0] == "Vers") { $marg_1 = $marg_1 + 1 ; } } if (!empty($row['date_mariage_2'])) { $marg_2 = substr($row['date_mariage_2'], -4); $date_marg2 = explode (" ",$row['date_mariage_2']); if ($date_marg2[0] == "Avant") { $marg_2 = $marg_2 - 1 ; } if ($date_marg2[0] == "Après" || $date_marg2[0] == "Entre" || $date_marg2[0] == "Vers") { $marg_2 = $marg_2 + 1 ; } } if (!empty($row['date_mariage_3'])) { $marg_3 = substr($row['date_mariage_3'], -4); $date_marg3 = explode (" ",$row['date_mariage_3']); if ($date_marg3[0] == "Avant") { $marg_3 = $marg_3 - 1 ; } if ($date_marg3[0] == "Après" || $date_marg3[0] == "Entre" || $date_marg3[0] == "Vers") { $marg_3 = $marg_3 + 1 ; } } if (!empty($row['date_mariage_4'])) { $marg_4 = substr($row['date_mariage_4'], -4); $date_marg4 = explode (" ",$row['date_mariage_4']); if ($date_marg4[0] == "Avant") { $marg_4 = $marg_4 - 1 ; } if ($date_marg4[0] == "Après" || $date_marg4[0] == "Entre" || $date_marg4[0] == "Vers") { $marg_4 = $marg_4 + 1 ; } } $tonarray[0]=array("mariage" => $marg_1 ,"date_mariage" => $row['date_mariage_1'] , "conjoint" => $row['num_cj_1'] , "lieu_mariage" => $row['lieu_mariage_1'] , "acte_mariage" => $row['acte_mariage_1'] , "divorce" => $row['divorce_1'], "photo_lieu" => $row['photo_lieu_lien_1']); $tonarray[1]=array("mariage" => $marg_2 ,"date_mariage" => $row['date_mariage_2'] , "conjoint" => $row['num_cj_2'] , "lieu_mariage" => $row['lieu_mariage_2'] , "acte_mariage" => $row['acte_mariage_2'] , "divorce" => $row['divorce_2']); $tonarray[2]=array("mariage" => $marg_3 ,"date_mariage" => $row['date_mariage_3'] , "conjoint" => $row['num_cj_3'] , "lieu_mariage" => $row['lieu_mariage_3'] , "acte_mariage" => $row['acte_mariage_3'] , "divorce" => $row['divorce_3']); $tonarray[3]=array("mariage" => $marg_4 ,"date_mariage" => $row['date_mariage_4'] , "conjoint" => $row['num_cj_4'] , "lieu_mariage" => $row['lieu_mariage_4'] , "acte_mariage" => $row['acte_mariage_4'] , "divorce" => $row['divorce_4']); asort($tonarray);
Le format de la date de mariage est généralement JJ MM AAAA. Mais elle peut aussi être sous forme "Avant AAAA" ou "Après AAAA" ou "Vers AAAA".
Je récupère les 4 derniers caractères de date_mariage qui correspondent à l'année du mariage.
Comment afficher les éléments du tableau par ordre croissant en fonction de ces 4 derniers caractères.
Merci
A voir également:
- Tri tableau
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Tableau croisé dynamique - Guide
- Logiciel tri photo - Guide
6 réponses
Bonjour,
En partant du principe que tes données sont stockées dans une BDD (vu ton code...)
J'ose espérer que les dates sont stockées dans des champs DATE (ou DATETIME ou TIMESTAMP)
Si ce n'est pas le cas... c'est que ton modèle de BDD n'est pas le bon !
Bref,
Tu as (dois avoir !) donc un champ correspondant à la DATE de mariage (au format YYYY-MM-DD) et un second champ (nommé par exemple info_date ) qui correspond a ta mention AVANT, APRES, VERS ( mais stocké sous forme numérique correspondant à l'ordre souhaité )
AUCUNE PRECISION = 0
AVANT = 1
VERS = 2
APRES = 3
Il t'est alors facile de récupéré déjà trié les infos depuis une requête SQL en utilisant simplement un ORDER BY
Par contre, quand je vois que tu as des champs date_mariage_1 date_mariage_2 date_mariage_3 date_mariage_4 ... je pense que tu n'as tenu compte d'aucune des remarques déjà données dans tes précédentes questions.
Tu t'obstines à travailler avec une structure de bdd bancale .... et c'est aussi un peu pour ça que tu es obligé de bidouillé en permanence ton code en PHP pour essayer d'obtenir ce que tu souhaites... là où, si la bdd était bien faite tu aurais tes résultats en quelques secondes sans avoir trop à réfléchir.
Bon courage.
En partant du principe que tes données sont stockées dans une BDD (vu ton code...)
J'ose espérer que les dates sont stockées dans des champs DATE (ou DATETIME ou TIMESTAMP)
Si ce n'est pas le cas... c'est que ton modèle de BDD n'est pas le bon !
Bref,
Tu as (dois avoir !) donc un champ correspondant à la DATE de mariage (au format YYYY-MM-DD) et un second champ (nommé par exemple info_date ) qui correspond a ta mention AVANT, APRES, VERS ( mais stocké sous forme numérique correspondant à l'ordre souhaité )
AUCUNE PRECISION = 0
AVANT = 1
VERS = 2
APRES = 3
Il t'est alors facile de récupéré déjà trié les infos depuis une requête SQL en utilisant simplement un ORDER BY
SELECT * FROM tatable ORDER BY datemariage, info_date
Par contre, quand je vois que tu as des champs date_mariage_1 date_mariage_2 date_mariage_3 date_mariage_4 ... je pense que tu n'as tenu compte d'aucune des remarques déjà données dans tes précédentes questions.
Tu t'obstines à travailler avec une structure de bdd bancale .... et c'est aussi un peu pour ça que tu es obligé de bidouillé en permanence ton code en PHP pour essayer d'obtenir ce que tu souhaites... là où, si la bdd était bien faite tu aurais tes résultats en quelques secondes sans avoir trop à réfléchir.
Bon courage.
J'ai 12000 personnages dans la base. Avec pour chaque personnage une date de naissance, une de décès, une à quatre dates de mariages. Soit 3 à 6 dates par enregistrement. Je ne peux pas m'amuser à reprendre toutes les dates ............!!!???
Sans compter qu'il y aurait également tous les scripts à modifier ..............
N'y a t'il pas moyen de trier l'Array en fonction de $marg_1, $marg_2, $marg_3 et $marg_4 ?
Sans compter qu'il y aurait également tous les scripts à modifier ..............
N'y a t'il pas moyen de trier l'Array en fonction de $marg_1, $marg_2, $marg_3 et $marg_4 ?
Salut,
Pas certain d'avoir bien compris ton besoin mais une solution serait éventuellement d'utiliser la fonction usort() pour écrire ta propre fonction de comparaison pour le tri du tableau : http://php.net/manual/fr/function.usort.php
Exemple :
Bonne journée,
Pas certain d'avoir bien compris ton besoin mais une solution serait éventuellement d'utiliser la fonction usort() pour écrire ta propre fonction de comparaison pour le tri du tableau : http://php.net/manual/fr/function.usort.php
Exemple :
$tonarray = [ ['mariage' => 'Mariage 1', 'date_mariage' => '2004'], ['mariage' => 'Mariage 2', 'date_mariage' => '2002'], ['mariage' => 'Mariage 3', 'date_mariage' => '2008'], ]; // tableau pas trié var_dump($tonarray); usort($tonarray, function($a, $b) { return $a['date_mariage'] > $b['date_mariage']; }); // tableau trié var_dump($tonarray);
Bonne journée,
Je pense savoir quelle attitude adopter, mais je ne sais pas comment l'écrire.
Si j'écris $marg = substr($tonarray[$i]['date_mariage'], -4);, $marg contient toutes les années des différents mariages. Exemple $marg =20121995 pour 2 mariages (2012 et 1995).
Il faut que je découpe $marg de 4 en 4, et ensuite que je trie dans l'ordre ASC tous les résultats.
J'ai essayé en utilisant les fonction usort, str_split(), substr .......... mais j'y arrive pas !!!
Si j'écris $marg = substr($tonarray[$i]['date_mariage'], -4);, $marg contient toutes les années des différents mariages. Exemple $marg =20121995 pour 2 mariages (2012 et 1995).
Il faut que je découpe $marg de 4 en 4, et ensuite que je trie dans l'ordre ASC tous les résultats.
J'ai essayé en utilisant les fonction usort, str_split(), substr .......... mais j'y arrive pas !!!
J'ai le message d'erreur
Parse error: syntax error, unexpected T_FUNCTION in /mnt/100/sda/1/4/th11/gen_famille/gestion/fiche_indiv.php on line 479
Ligne qui correspond à
usort($tonarray, function($a, $b) {
Parse error: syntax error, unexpected T_FUNCTION in /mnt/100/sda/1/4/th11/gen_famille/gestion/fiche_indiv.php on line 479
Ligne qui correspond à
usort($tonarray, function($a, $b) {
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Il doit y avoir un problème, car mon deuxième var_dump ne s'affiche pas, et la suite du script non plus ..........
Pensant que ça aurait été plus simple, j'ai essayé de trier mon tableau en faisant
Mais j'ai le message d'erreur
Warning: array_multisort() [function.array-multisort]: Argument #1 is expected to be an array or a sort flag in ..........
// tableau pas trié var_dump($tonarray); function tri_mariage($a, $b) { return $a['date_mariage'] > $b['date_mariage']; } usort($tonarray, "tri_mariage"); { return substr($a['date_mariage'], -4) > substr($b['date_mariage'], -4); } // tableau trié var_dump($tonarray);
Pensant que ça aurait été plus simple, j'ai essayé de trier mon tableau en faisant
array_multisort($date_mariage, SORT_ASC, $tonarray);
Mais j'ai le message d'erreur
Warning: array_multisort() [function.array-multisort]: Argument #1 is expected to be an array or a sort flag in ..........