IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] trier un tableau sur un nombre variable de colonnes


Sujet :

Langage PHP

  1. #1
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut [Tableaux] trier un tableau sur un nombre variable de colonnes
    Bonjour

    J'aimerais avec une seule fonction trier un tableau sur un nombre variable de colonnes. J'utilise pour ça la fonction array_multisort, avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //Pour une colonne
    array_multisort($foo[0],constant($ordre[0]), $tableau_a_trier);
    //Pour 2 colonnes
    array_multisort($foo[0],constant($ordre[0]), $foo[1],constant($ordre[1]), $tableau_a_trier);
    etc...
    Quelle est la syntaxe pour avoir n paramètres, n étant variable ?

    Merci d'avance

  2. #2
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 43
    Points : 52
    Points
    52
    Par défaut
    salut,

    Je ne suis pas sur de bien comprendre ta question, mais pour trier un tableau avec plusieurs dimension, la réponse est dans la FAQ :

    http://php.developpez.com/faq/?page=...ab_trimultidim

    En espèrant que ca t'aide...

  3. #3
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Je n'ai peut-être pas été assez clair : je sais très bien trier un tableau multidimensionnel sur un nombre fixe de colonnes, mais pas sur un nombre variable.
    Je souhaite faire une fonction capable de trier mon tableau selon un nombre quelconque de colonnes. Il faut donc faire passer un nombre d'arguments variable à la fonction array_multisort.

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 43
    Points : 52
    Points
    52
    Par défaut
    Eh bien, cette source etait un point de départ. Il suffit juste de rajouter une variable fixant le numero de la colonne sur laquelle tu veux effectuer le tri, et tu peux même ajouter un sens de tri.

    Le code suivant répond t-il a ta problématique ?

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    	$tab = array(array(1,2,3),array(0,1,4));
     
    	function tri($a,$b) {
    		global $COL;
    		global $SENS;
     
    		if ($a[$COL] == $b[$COL]) 
    			return 0;
    		if ($SENS == "asc") return ($a[$COL] < $b[$COL]) ? -1 : 1;
    		else return ($a[$COL] > $b[$COL]) ? -1 : 1;
    	}
     
     
    	echo "<pre>";
    		foreach($tab as $elem) {
    			echo $elem[0], " ", $elem[1], " ", $elem[2], "<br />";
    		}
    	echo "</pre>";
     
    	$COL = 0;
    	$SENS = "asc";
    	usort($tab, "tri");
     
    	echo "<pre>";
    		foreach($tab as $elem) {
    			echo $elem[0], " ", $elem[1], " ", $elem[2], "<br />";
    		}
    	echo "</pre>";
     
    	$COL = 2;
    	$SENS = "asc";
    	usort($tab, "tri");
     
    	echo "<pre>";
    		foreach($tab as $elem) {
    			echo $elem[0], " ", $elem[1], " ", $elem[2], "<br />";
    		}
    	echo "</pre>";
    Affecte n'importe quoi d'autre pour $SENS afin d'avoir un tri descendant.

    A partir de la tu peux avoir le nombre de colonne que tu veux dans ton tableau, il suffit juste de s'assurer que le chiffre de $COL n'est pas au-dela du nombre de colonne du tableau.

  5. #5
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Merci beaucoup pour ta réponse. Ton code répond pas mal à ma problématique, même si je vais avoir quelques adaptations à faire, du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $COLS = array(0,2);
    $SENSS = array("asc", "desc");
    for($i = 0, $i < count($COLS) {
       $COL = $COLS[$i];
       $SENS = $SENSS[$i];
       usort($tab, "tri");
    }
    En ajoutant toutes les vérifications d'usage, bien sur.
    C'est dommage de ne pas pouvoir le faire d'un seul coup avec array_multisort, j'avais ce code ci :
    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
     
    $foo = array();
    /*Partie qui ne marche pas*/
    if(isset($this->trifixe) ){
      foreach($this->trifixe as $bar) {
        foreach($this->res as $foobar) {
          $foofixe[] = $foobar[$bar];
        }
      $foofixefull[] = $foofixe;
      }
    /*Fin partie qui ne marche pas*/
    }
    foreach($this->res as $bar) {
      $foo[] = $bar[$tri];
    }
    $ordre = "SORT_".$sens;
    array_multisort($foo,constant($ordre), $this->res);
    Le but est d'avoir des colonnes de tri fixes ($this->trifixe), et une autre déterminée par l'utilisateur ($tri), un peu comme dans un tableau croisé dynamique d'excel.
    Cependant, le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval("array_multisort($foo,constant($ordre), $this->res);");
    ne fonctionne pas car $foo renvoie Array.
    Peut être avec un print_r et des ob_start ça pourrait marcher, mais c'est pas une méthode super simple.

    Sinon j'ai trouvé un autre code qui a aussi l'air compliqué ici : http://fr3.php.net/manual/fr/functio...sort.php#69241

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 43
    Points : 52
    Points
    52
    Par défaut
    Je ne sais vraiment pas comment faire pour passer un argument par le callback, d'ailleurs je doute que ce soit possible, mais je ne suis pas expert...

    Ensuite je trouve domage de ne pas utiliser usort() qui est éprouvé et + performant que des tri que l'on peut programmer soit-même.

    Enfin, une solution simple est toujours préférable a une solution complexe, car elle est + fiable et la maintenance + facile.

    mais ce n'est que mon opinion...

    Bonne prog !

  7. #7
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    En fait, je viens de trouver une solution simple. Pas le temps de la mettre en oeuvre ce soir, mais elle tient en peu de lignes, et n'utilise qu'une seule fois une fonction de tri, donc on peut espérer qu'elle est plus rapide.
    Je poste le code demain si tout va bien.

    PS : je ne programme pas moi-même mes tris, c'est nettement trop compliqué vu les fonctions que propose déjà php!

  8. #8
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 43
    Points : 52
    Points
    52
    Par défaut
    ah oui, si tu as une solution simple je suis interessé.

    @+

  9. #9
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Ca y est, je poste ma solution simple. Le but de ce code est de trier un tableau multidimensionnel suivant 2 types de dimensions :
    - des dimensions fixes, définies par la personne qui a écrit le tableau dans l'array $this->trifixe, et les sens de tri dans l'array $this->trifixesens
    - une dimension variable, définie par la personne qui consulte l'état (en cliquant sur un en-tête de colonne par exemple) dans la variable $tri2 et le sens $sens
    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
     
    if(isset($this->trifixe) ){
      $foofixefull = array();
      foreach($this->trifixe as $bar) {
        $foofixe = array();
        foreach($this->res as $foobar) {
          $foofixe[] = $foobar[$bar];
        }
        $foofixefull[] = $foofixe;
      }
    }
    $foo = array();
    foreach($this->res as $bar) {
      $foo[] = $bar[$tri2];
    }
    $ordre = "SORT_".$sens;
    $evalme = "array_multisort(";
    if(isset($foofixefull)) {
      for($i = 0; $i < sizeof($foofixefull); $i++) {
        $evalme .= "\$foofixefull[$i], constant('SORT_'.\$this->trifixesens[$i]) ";
      }
      $evalme .= ',';
    }
    $evalme .= "\$foo,$ordre, \$this->res);";
    //echo $evalme;
    eval($evalme);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] Somme en ligne sur un nombre variable de colonnes
    Par mariem84 dans le forum SAS Base
    Réponses: 7
    Dernier message: 11/10/2013, 16h01
  2. [Tableaux] Trier un tableau sur 2 élements!
    Par GYK dans le forum Langage
    Réponses: 5
    Dernier message: 09/12/2008, 15h30
  3. trier un tableau sur les en-tetes de colonnes
    Par debutant_linux dans le forum Ruby on Rails
    Réponses: 10
    Dernier message: 29/08/2007, 10h39
  4. Réponses: 3
    Dernier message: 15/03/2007, 12h09
  5. Réponses: 3
    Dernier message: 26/09/2005, 22h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo