8768 sujets

Développement web côté serveur, CMS

Modérateur
Bonjour,

Allons droit au but... Voici mon tabeau (array) :

Array
(
    [0] => Array
        (
            [id] => 400
            [date] => 2016-06-23
            [title] => Titre 0
        )

    [1] => Array
        (
            [id] => 44
            [date] => 2016-06-30
            [title] => Titre 1
        )

    [2] => Array
        (
            [id] => 1061
            [date] => 2016-07-07
            [title] => Titre 2
        )

    [3] => Array
        (
            [id] => 421
            [date] => 2016-06-17
            [title] => Titre 3
        )

    [4] => Array
        (
            [id] => 170
            [date] => 2016-06-28
            [title] => Titre 4
             
        )

    [5] => Array
        (
            [id] => 310
            [date] => 2016-06-27
            [title] => Titre 5
            
        )
)

Je souhaiterais trier ce tableau en prenant en compte la date (trier du plus récent au plus ancien) et en conservant les associations c'est à dire que par exemple l'id 310 devra rester avec la date 2016-06-27 et le titre "titre 5" après le tri. En somme il faudrait que les clés (0, 1, 2, 3, 4, 5) soient redispatchées selon les dates.
Comment je fais ? Multisort (pas trop bien compris...) ?

Merci d'avance Smiley smile
Modérateur
Bon ben j'ai trouvé. La réponse se trouvait ici : http://www.developpez.net/forums/d1222763/php/langage/fonctions/trier-tableau-multidimensionnel-fonction-2e-dimension/#post6688188
Donc pour trier dans l'ordre voulu (du plus récent au plus ancien), il fallait faire ça :

foreach($mon_tableau as $k => $v) {
   $d[$k] = $v['date'];
}
array_multisort($d, SORT_DESC, $mon_tableau);

J'avoue n'avoir rien compris à la chose, mais l'essentiel c'est que ça fonctionne...
Je comprends qu'on crée un nouveau tableau en n'utilisant que les valeurs de dates et ensuite en l'utilise pour trier le tableau original dans array_mulitsort(). Je n'arrive pas à comprendre comment on fait pour trier mon tableau d'origin en utilisant le tableau $d...
Salut,

En gros (si j'ai bien tout compris, j'ai utilisé ça il y a quelques temps) à partir de ton tableau tu en crée un autre uniquement avec les dates et ces dates ont le même index que ton tableau d'origine.

Du coup la fonction se base du ton $d de dates, les tris, à un nouvel ordre pour les index et s'en sert pour réorganiser ton tableau original.

( Dans ma tête c'est clair mais je sais pas si je l'explique bien )
Modérateur
p.s. tu peux aussi utiliser usort qui te permet de trier grâce à une fonction de comparaison (et gère donc aussi les cas plus complexes):

usort($mon_tableau, function($a, $b){
  if ($a['date'] == $b['date']) return 0;
  return ($a['date'] < $b['date']) ? -1 : 1;
});
Modérateur
OK kustolovic pour ton alternative qui me plaît davantage puisqu'on n'a pas à créer un tableau supplémentaire en lançant une boucle. mais est-ce qe cela s'applique à mon cas (je rappelle que mon tableau à plusieurs dimensions et que 'date' est à l'intérieur du deuxième tableau). Merci en tout cas pour le partage de connaissance Smiley smile
Modérateur
Oui complètement, dans mon exemple, on utilise une comparaison, qui reçoit deux éléments du tableau ($a et $b), on retourne ensuite 0 pour l'égalité, -1 pour est plus petit et 1 pour est plus grand. (note que j'ai toujours un doute sur le sens => dans mon exemple inverser -1 et 1 ou changer < en > pour inverser l'ordre).

L'avantage est que l'on peut faire fonctionner avec toutes sortes de structures parfois très complexes, ou mettre des règles de tri plus complexes.

Par exemple ça fonctionnera aussi avec un tableau à 4 niveaux:


usort($mon_tableau, function($a, $b){
  if ($a['truc']->getStart['date'] == $b['truc']->getStart['date']) return 0;
  return ($a['truc']->getStart['date'] < $b['truc']->getStart['date']) ? -1 : 1;
});
Modérateur
Merci kustolovic pour ces précisions. Ça pourra sûrement être utile à l'avenir...