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 :

Problème Tri Tableau multidimensionnel


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Points : 11
    Points
    11
    Par défaut Problème Tri Tableau multidimensionnel
    Hello à tous, J'espère poster dans la bonne section...

    Alors j'ai un petit problème assez embétant :

    J'ai un tableau formé de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tab[0] = array ("cle1"=>val1,"clé2"=>val2);
    tab[1] = array ("cle1"=>val1,"clé2"=>val2);
    tab[2] = array ("cle1"=>val1,"clé2"=>val2);
    tab[3] = array ("cle1"=>val1,"clé2"=>val2);
    en gros un tableau de tableaux associatifs...

    J'aimerai trier mon tableau "tab" en fonction de la valeur de val1, le tout de manière décroissante : exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //Avant trie :
     
    tab[0] = array ("cle1"=>5,"clé2"=>val2);
    tab[1] = array ("cle1"=>10,"clé2"=>val2);
    tab[2] = array ("cle1"=>12,"clé2"=>val2);
    tab[3] = array ("cle1"=>6,"clé2"=>val2);
     
    //après trie :
     
    tab[0] = array ("cle1"=>12,"clé2"=>val2);
    tab[1] = array ("cle1"=>10,"clé2"=>val2);
    tab[2] = array ("cle1"=>6,"clé2"=>val2);
    tab[3] = array ("cle1"=>5,"clé2"=>val2);
    J'ai essayé d'utiliser la fonction usort() de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    usort ($tab, "fctCompare");
     
    function fctCompare($elemA, $elemB)
    {
    	return ($elemA['clé1'] > $elemB['clé1']) ? -1 : 1;
    }
    Sauf que bein commes vous vous en doutez sa marche pas xD

    ca me retourne l'erreur :
    usort() function.usort: Invalid comparison function

    Des pistes ?

  2. #2
    Membre actif Avatar de buse974
    Homme Profil pro
    Développeur / Chef de projet informatique
    Inscrit en
    Février 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur / Chef de projet informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 117
    Points : 245
    Points
    245
    Par défaut
    Salut.

    avec array_multisort ca devrait passer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    array_multisort($tab,SORT_DESC);
     
     
    foreach ($tab as $item)
    {
    	echo $item['cle1'] . " => " . $item['clé2'] . "<br />";
    }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Merci pour ta réponse mais avec array_multisort tu spécifies a aucun moment quel est le champ de référence pour le trie.

    J'ai simplifié mon exemple mais en réalité mon tableau $tab serait plutot organisé comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    tab[0] = array ("cle1"=>val1,"clé2"=>val2,"clé3"=>val3,"clé4"=>val4);
    tab[1] = array ("cle1"=>val1,"clé2"=>val2,"clé3"=>val3,"clé4"=>val4);
    tab[2] = array ("cle1"=>val1,"clé2"=>val2,"clé3"=>val3,"clé4"=>val4);
    tab[3] = array ("cle1"=>val1,"clé2"=>val2,"clé3"=>val3,"clé4"=>val4);
    et je voudrais le trier en fonction de val3 ( et non val1 )... D'autres pistes ? :p

  4. #4
    Membre actif Avatar de buse974
    Homme Profil pro
    Développeur / Chef de projet informatique
    Inscrit en
    Février 2007
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur / Chef de projet informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 117
    Points : 245
    Points
    245
    Par défaut
    Salut, j'ai cherché j'ai pas trouvé.

    donc je me suis amusé a faire une fonction.

    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
     
    function trie($tab,$soustable)
    {
        $tmp;
        $tmp_final;
     
      foreach ($tab as $key => $item)
      {
        	$tmp[$key] = $item[$soustable];
      }
     
         	asort($tmp);
     
         	foreach ($tmp as $key => $item)
        	{
        		$tmp_final[] = $tab[$key];
        	}
     
        	return $tmp_final;
        }
     
     
    //donc
     
    $tab = trie($tab,"clé3");
    Y a peu etre plus propre mais sa fonctionne

  5. #5
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut, une soluce avec usort :

    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
    $tab[] = array ("3" => 'val1',"clé2"=>'val2',"clé3"=>50,"clé4"=>val4);
    $tab[] = array ("1" => 'val1',"clé2"=>'val2',"clé3"=>12,"clé4"=>val4);
    $tab[] = array ("0"=> 'val1',"clé2"=>'val2',"clé3"=>2,"clé4"=>val4);
    $tab[] = array ("2"=> 'val1',"clé2"=>'val2',"clé3"=>40,"clé4"=>val4);
     
     
    function cmp($a, $b)
    {
        if ($a['clé3'] == $b['clé3']) {
            return 0;
        }
        return ($a['clé3'] < $b['clé3']) ? -1 : 1;
    }
     
    usort($tab, "cmp");
     
    echo '<pre>';
    var_dump($tab);
    echo '</pre>';

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Bon alors déjà merci pour vos réponses.

    pour info Djakisback, j'ai tenté le usort mais sa marche pas dans mon cas, va savoir pourquoi =)


    Pour buse974, Ta fonction est simple est la logique m'a l'air bonne, c'est super sympa d'avoir chercher mais j'ai trouvé une solution sans recréer de fonction, et tu m'avais mis sur la bonne piste avec "array_multisort"

    je marque la solution ici au cas où d'autre personnes en auraient besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach ($tab as $key => $row)
    {
    	$col1[$key]  = $row['cle1'];
    	$col2[$key] = $row['cle2'];
    }
     
    array_multisort($col1, SORT_DESC,$col2, $tab);
    //le tableau $tab sera à présent trié en se basant sur les valeurs de 
    //$tab[]['clé1'] (dans un ordre Descendant )
    Bon en lisant juste le code on comprend pas la logique, la réponse est la :
    http://us2.php.net/manual/fr/functio...-multisort.php : EXEMPLE 3

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

Discussions similaires

  1. Tri tableau multidimensionnel
    Par skrime dans le forum Langage
    Réponses: 4
    Dernier message: 25/06/2012, 16h10
  2. [MySQL] Problème de tableau multidimensionnel dans une session
    Par harkness dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 01/02/2011, 11h06
  3. Problème compilation tableau multidimensionnel
    Par Marneus dans le forum Débuter
    Réponses: 6
    Dernier message: 23/03/2009, 16h57
  4. Réponses: 7
    Dernier message: 02/07/2008, 16h06
  5. Réponses: 2
    Dernier message: 15/05/2007, 16h56

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