Une requete mysql me retourne des enregistrements triés sur le champ pagetitle.
La structure retournée contient les champs id et pagetitle et type :
A cette structure je rajoute une colonne "rank" et je souhaite trier tous les lignes sur la base de cette colonne, tout en conservant l'ordre relatif des autres colonnes (puisque déjà trié).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 $data[] = array( 'id' => 63 ,'title' => p8 , 'type' => 0, 'rank' => 1 ); $data[] = array( 'id' => 66 ,'title' => p7 , 'type' => 0, 'rank' => 101 ); $data[] = array( 'id' => 69 ,'title' => p6 , 'type' => 1, 'rank' => 1 ); $data[] = array( 'id' => 71 ,'title' => p5 , 'type' => 0, 'rank' => 1 ); $data[] = array( 'id' => 72 ,'title' => p4 , 'type' => 0, 'rank' => 1 ); $data[] = array( 'id' => 67 ,'title' => p3 , 'type' => 1, 'rank' => 1 ); $data[] = array( 'id' => 70 ,'title' => p2 , 'type' => 1, 'rank' => 101); $data[] = array( 'id' => 64 ,'title' => p1 , 'type' => 1, 'rank' => 1 );
Pour cela j'utilise la fonction array_multisort:
Seul problème, si la colonne rank est bien triée, l'ordre initial de la colonne pagetitle est lui modifié. En fait la fonction utilise la colonne id pour trier les lignes de même valeur rank par valeur ASC. Résultat le tri sur la colonne pagetitle est perdu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 <?php $data[] = array( 'id' => 63 ,'title' => p8 , 'type' => 0, 'rank' => 1 ); $data[] = array( 'id' => 66 ,'title' => p7 , 'type' => 0, 'rank' => 101 ); $data[] = array( 'id' => 69 ,'title' => p6 , 'type' => 1, 'rank' => 1 ); $data[] = array( 'id' => 71 ,'title' => p5 , 'type' => 0, 'rank' => 1 ); $data[] = array( 'id' => 72 ,'title' => p4 , 'type' => 0, 'rank' => 1 ); $data[] = array( 'id' => 67 ,'title' => p3 , 'type' => 1, 'rank' => 1 ); $data[] = array( 'id' => 70 ,'title' => p2 , 'type' => 1, 'rank' => 101); $data[] = array( 'id' => 64 ,'title' => p1 , 'type' => 1, 'rank' => 1 ); for($d=0;$d<count($data);$d++) { print_r($data[$d]); echo "<br />\n\r"; } echo "<br />\n\r"; foreach ($data as $key => $row) { $rank[$key] = $row['rank']; } array_multisort($rank, SORT_DESC, $data); for($d=0;$d<count($data);$d++) { print_r($data[$d]); echo "<br />\n\r"; } ?>
Cf exemple ci-dessus à faire tourner.
Comment puis je trier les lignes du tableau en me basant sur la valeur rank sans perdre l'ordre des colonnes suivantes ?
Dit autrement on obtient cela, a savoir les lignes de rank=1 triées sur le champ ID:
et je voudrais avoir cela, c.a.d conserver le tri initial sur pagetitle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Array ( [id] => 66 [title] => p7 [type] => 0 [rank] => 101 ) Array ( [id] => 70 [title] => p2 [type] => 1 [rank] => 101 ) Array ( [id] => 63 [title] => p8 [type] => 0 [rank] => 1 ) Array ( [id] => 64 [title] => p1 [type] => 1 [rank] => 1 ) Array ( [id] => 67 [title] => p3 [type] => 1 [rank] => 1 ) Array ( [id] => 69 [title] => p6 [type] => 1 [rank] => 1 ) Array ( [id] => 71 [title] => p5 [type] => 0 [rank] => 1 ) Array ( [id] => 72 [title] => p4 [type] => 0 [rank] => 1 )
Je précise que dans l'exemple j'utilise pagetitle mais je pourrais avoir un nombre variables de colonnes déjà triées, donc impossible d'utiliser la colonne pagetitle pour préciser l'ordre en plus de celui de rank.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Array ( [id] => 66 [title] => p7 [type] => 0 [rank] => 101 ) Array ( [id] => 70 [title] => p2 [type] => 1 [rank] => 101 ) Array ( [id] => 66 [title] => p8 [type] => 0 [rank] => 1 ) Array ( [id] => 69 [title] => p6 [type] => 1 [rank] => 1 ) Array ( [id] => 71 [title] => p5 [type] => 0 [rank] => 1 ) Array ( [id] => 72 [title] => p4 [type] => 0 [rank] => 1 ) Array ( [id] => 67 [title] => p3 [type] => 1 [rank] => 1 ) Array ( [id] => 64 [title] => p1 [type] => 1 [rank] => 1 )
Merci de votre aide
Partager