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 :

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 );
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é).

Pour cela j'utilise la fonction array_multisort:
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";
}
?>
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.
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:
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 )
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] => 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 )
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.

Merci de votre aide