Version complète: sur le forum Webmaster Hub : tri tableau multi dimensionnel
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
lorik
Bonjour,

Je cherche à trier un tableau à 2 dimensions, par un de ses champs :
Ex, j'ai un tableau d'adresses :
nom, adresse, code_postal.

Comment trier par le code postal ?

J'ai binen vu 'sort', mais d'une part on pert la clé, et en plus ça ne marche pas avec les tableau multi-dimensions.

Merci de votre aide.
Dan
Salut Lorik,

En php, il existe la fonction asort() qui te permet de trier un tableau sans perdre les clés.
CODE
bool asort ( array &array [, int sort_flags] )

CODE
<?php
$fruits = array("d"=>"papaye",
               "a"=>"orange",
               "b"=>"banane",
               "c"=>"ananas");
asort($fruits);
foreach ($fruits as $key => $val) {
  echo "$key = $val\n";
}
?>

L'exemple ci-dessus va afficher :
fruits[c] = ananas
fruits[b] = banane
fruits[a] = orange
fruits[d] = papaye

Et si tu veux trier suivant les clés, tu as ksort()
lorik
Merci Dan, c'est donc ok pour les clés, mais pour les multi dimensions ?

A+
NorSeb
Salut,

Pour creuser le tri de tableaux multi-dimensionnels il y a la fonction usort.

Fonctionnement a découvrir là : http://www.nexen.net/docs/php/annotee/function.usort.php
TheRec
Bonjour,

j'ai trouvé ceci sur la page du manuel commentée de PHP :
CODE
<?php
function array_sort($array, $key)
{
  for ($i = 0; $i < sizeof($array); $i++) {
      $sort_values[$i] = $array[$i][$key];
  }
  asort ($sort_values);
  reset ($sort_values);
  while (list ($arr_key, $arr_val) = each ($sort_values)) {
        $sorted_arr[] = $array[$arr_key];
  }
  return $sorted_arr;
}
?>

et celui-ci, à toi de voir la solution qui te convient le mieux :
CODE
<?php
function array_sort_multi2($array, $key,$key2)

{
 for ($i = 0; $i < sizeof($array); $i++) {
      if(! empty($array[$i][$key][$key2])){
      $sort_values[$i] = $array[$i][$key][$key2];
      }else{
      $sort_values[$i] = $array[$i];
      }
 }
 asort ($sort_values);
 reset ($sort_values);
 while (list ($arr_keys, $arr_values) = each ($sort_values)) {
        $sorted_arr[] = $array[$arr_keys];
 }
 return $sorted_arr;
}
?>
lorik
Merci à tous,

C'est vrai que j'ai plein de bouquins Php, à priori (trop ?) bons pour mon niveau, et je ne vais voir dans les docs en ligne que quand je connais le nom de la fonction. Il faut que je m'organise mieux, mais je fais ça à la petite semaine, pour le plaisir et sans formation de base... ce qui ne m'autorise pas à vous emm... à tout bout de champs !

Je crois avoir compris le fonctionnement de la fonction, mais j'ai un bug ! php renvoie un Undefined offset: 0 (et 1 et 2) dans le script de test ci dessous. La fonction ne semble pas en cause, c'est semble t il un pb d'initialisation de variable, mais le tableau fautif ($sorted_arr) est déclaré juste avant, alors je cale un peu.

Si vous pouviez jeter un coup d'oeil, ça serait sympa...

Par avance merci.


CODE
function array_sort($array, $key)
{
  for ($i = 0; $i < sizeof($array); $i++)
  {
    $sort_values[$i] = $array[$i][$key];
   }
  asort ($sort_values);
  reset ($sort_values);
  while (list ($arr_key, $arr_val) = each ($sort_values)) {
        $sorted_arr[] = $array[$arr_key];
  }
  return $sorted_arr;
}


    $keyword_table = array();
    $total2        = array();
    $record2 = array();
    $sorted_arr=array();

// je remplis le tableau
      $record2[0] = "conv3";
      $record2[1] = 100;
      $record2[2] = 10;
      array_push($keyword_table,$record2);

      $record2[0] = "conv2";
      $record2[1] = 200;
      $record2[2] = 20;
       array_push($keyword_table,$record2);
   
      $record2[0] = "conv1";
      $record2[1] = 10;
      $record2[2] = 10;
      array_push($keyword_table,$record2);


// je lance la fonction
array_sort($keyword_table, 0); // tri des termes 'conv xx'

// verif du tri (c'est là qu'ça coince !)
$val1=$sorted_arr[0][1];
$val2=$sorted_arr[1][1];
$val3=$sorted_arr[2][1];
echo "<br>".$val1."-".$val2."-".$val3;
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.