Tri tableau

Résolu/Fermé
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 - 28 janv. 2018 à 12:20
yg_be Messages postés 22719 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 - 1 févr. 2018 à 12:05
Bonjour,

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

6 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
28 janv. 2018 à 13:17
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

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.



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 28 janv. 2018 à 17:50
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 ?
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
30 janv. 2018 à 16:25
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 :
$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,
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 30 janv. 2018 à 17:33
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 !!!
0
yg_be Messages postés 22719 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024
30 janv. 2018 à 20:23
bonsoir,
as-tu essayé la suggestion de Pitet?
peut-être en l'adaptant ainsi:
au lieu de:
return $a['date_mariage'] > $b['date_mariage'];

essayons:
return substr($a['date_mariage'], -4) > substr($b['date_mariage'], -4);
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
31 janv. 2018 à 17:38
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) {
0
yg_be Messages postés 22719 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
31 janv. 2018 à 17:46
je pense qu'il faut mettre ceci en début du code php:
function tri_mariage($a, $b) {
   return $a['date_mariage'] > $b['date_mariage'];
}

et puis remplacer les lignes avec usort par:
usort($tonarray, "tri_mariage");
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
31 janv. 2018 à 18:10
Il doit y avoir un problème, car mon deuxième var_dump ne s'affiche pas, et la suite du script non plus ..........
// 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 ..........
0
yg_be Messages postés 22719 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
Modifié le 31 janv. 2018 à 19:35
function tri_mariage($a, $b) {
   return substr($a['date_mariage'], -4) > substr($b['date_mariage'], -4);
}

// tableau pas trié
var_dump($tonarray);

usort($tonarray, "tri_mariage"); 

// tableau trié
var_dump($tonarray);
0
t671 Messages postés 1419 Date d'inscription lundi 25 février 2008 Statut Membre Dernière intervention 26 février 2024 11
1 févr. 2018 à 10:17
Génial ! Merci beaucoup yg_be !
En fait, il suffisait que de trois lignes .............
Merci beaucoup :o)
A ++
0
yg_be Messages postés 22719 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
1 févr. 2018 à 12:05
merci Pitet
0