Menu

Tri tableau [Résolu]

t671 1196 Messages postés lundi 25 février 2008Date d'inscription 21 mars 2018 Dernière intervention - 28 janv. 2018 à 12:20 - Dernière réponse : yg_be 5533 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 17 mai 2018 Dernière intervention
- 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
Afficher la suite 

Votre réponse

11 réponses

jordane45 21019 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 18 mai 2018 Dernière intervention - 28 janv. 2018 à 13:17
0
Utile
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.



Commenter la réponse de jordane45
t671 1196 Messages postés lundi 25 février 2008Date d'inscription 21 mars 2018 Dernière intervention - Modifié par t671 le 28/01/2018 à 17:50
0
Utile
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 ?
Commenter la réponse de t671
Pitet 2378 Messages postés lundi 11 février 2013Date d'inscription 2 février 2018 Dernière intervention - 30 janv. 2018 à 16:25
0
Utile
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,
t671 1196 Messages postés lundi 25 février 2008Date d'inscription 21 mars 2018 Dernière intervention - 30 janv. 2018 à 17:32
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 !!!
yg_be 5533 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 17 mai 2018 Dernière intervention > t671 1196 Messages postés lundi 25 février 2008Date d'inscription 21 mars 2018 Dernière intervention - 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);
Commenter la réponse de Pitet
t671 1196 Messages postés lundi 25 février 2008Date d'inscription 21 mars 2018 Dernière intervention - 31 janv. 2018 à 17:38
0
Utile
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) {
yg_be 5533 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 17 mai 2018 Dernière intervention - 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");
Commenter la réponse de t671
t671 1196 Messages postés lundi 25 février 2008Date d'inscription 21 mars 2018 Dernière intervention - 31 janv. 2018 à 18:10
0
Utile
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 ..........
yg_be 5533 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 17 mai 2018 Dernière intervention - 31 janv. 2018 à 19:34
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);
Commenter la réponse de t671
t671 1196 Messages postés lundi 25 février 2008Date d'inscription 21 mars 2018 Dernière intervention - 1 févr. 2018 à 10:17
0
Utile
Génial ! Merci beaucoup yg_be !
En fait, il suffisait que de trois lignes .............
Merci beaucoup :o)
A ++
yg_be 5533 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 17 mai 2018 Dernière intervention - 1 févr. 2018 à 12:05
merci Pitet
Commenter la réponse de t671