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] Problème de tri de tableau associatif multidimensionnel


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Points : 168
    Points
    168
    Par défaut [Tableaux] Problème de tri de tableau associatif multidimensionnel
    Bonjour,

    Je cherche à trier via la fonction array_multisort un tableau multidimensionnel associatif...

    Un dessin valant 10 lignes d'explications, voilà un exemple de ce à quoi ressemble le tableau :

    Les données du tableau sont dans un bdd mysql.

    Mon but est de pouvoir trier le tableau en fonction de plusieurs critères, en selectionnant le premier en cliquant sur un nom de colonne (Date, Name...)

    Mon tableau est créé grâce aux lignes de codes suivantes

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    $query1="SELECT Prj.ProjectID as ProjectID,Prj.Name as PrjName,Prj.PrgMgrID as PrgMgrID,Prg.Name as PrgName
    		 FROM project Prj, PrgMgr Prg 
    		 WHERE Prj.Archived='".$Archived."' 
    		 AND Prj.PrgMgrID=Prg.PrgMgrID";
    $result=mysql_query($query1);
    $i=0;
    while ($val1 = mysql_fetch_array($result)){
    	if($val1['ProjectID']!=1){//so as not to show the "undefined" entry
    		$Tab[$i]['ProjectID']=$val1['ProjectID'];
    		$Tab[$i]['Name']=htmlentities($val1['PrjName']);
    		$Tab[$i]['Name']=addslashes($Tab[$i]['Name']);
    		$Tab[$i]['PresentationPath']="none";
    		$Tab[$i]['PrgMgr']=$val1['PrgName'];
    		$Max=-2;
    		$query3="SELECT Number,SteeringDate,State,PresentationPath FROM phase WHERE ProjectID='".$val1['ProjectID']."';";
    		$res=mysql_query($query3);
    		if(mysql_numrows($res)!=0){
    			while ($val3 = mysql_fetch_array($res)){
    				if($val3['Number']>$Max)
    				{
    					$Max=$val3['Number'];
    					$Tab[$i]['Date']=$val3['SteeringDate'];		
     
    					switch($Max){
     
    						case -1 : $Tab[$i]['Phase']="Kick Off";
    						break;
     
    						case 0 : $Tab[$i]['Phase']="Phase 0";
    						break;
     
    						case 1 : $Tab[$i]['Phase']="Phase 1";
    						break;
     
    						case 2 : $Tab[$i]['Phase']="Phase 2";
    						break;
     
    						case 3 : $Tab[$i]['Phase']="Phase 3";
    						break;
     
    						case 4 : $Tab[$i]['Phase']="Phase 4";
    						break;
     
    						default : $Tab[$i]['Phase']="No Phase";	
    					}
    					switch($val3['State']){
     
    						case 0 : $Tab[$i]['StateColor']="#f00000";//red
    						break;
     
    						case 1 : $Tab[$i]['StateColor']="#f4da00";//orange
    						break;
     
    						case 2 : $Tab[$i]['StateColor']="#f4a100";//yellow
    						break;
     
    						case 3 : $Tab[$i]['StateColor']="#20c106";//green
    						break;
     
    						default : $Tab[$i]['StateColor']="#000000";//black
    					}
    					$Tab[$i]['PresentationPath']=$val3['PresentationPath'];
    				}
    			}
    		}
    		else
    		{
    			$Tab[$i]['Date']=" ";
    			$Tab[$i]['Phase']="No Phase";
    			$Tab[$i]['StateColor']="#000000";
    		}
    		$i++;
    	}	
    }
    Et j'ai essayé d'effectuer le tri de la façon suivante :

    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
    switch ($Order) {
     
    case Name:		array_multisort($Tab[]['Name'], SORT_ASC, SORT_STRING);
    break;
     
    case PrgMgr:	array_multisort($Tab[]['PrgMgr'], SORT_ASC, SORT_STRING,$Tab[]['Name'], SORT_ASC, SORT_STRING);
    break;
     
    case Phase:		array_multisort($Tab[]['Phase'], SORT_ASC, SORT_STRING,$Tab[]['Name'], SORT_ASC, SORT_STRING);
    break;
     
    case Date:		array_multisort($Tab[]['Date'], SORT_ASC, SORT_NUMERIC,$Tab[]['Name'], SORT_ASC, SORT_REGULAR);
    break;
     
    default: echo "<div style='position:absolute; left:50%; top:50%; Z-index:10;'>ERROR</div>";
    }
    Le fait de laisser un crochet vide devant ne marche pas (je veux pas selectionner une ligne mais toutes...)

    Au début je n'avais pas mis les [], et en mettant des noms du style $Tab[ID]
    L'erreur renvoyée était :
    Warning: array_multisort(): Argument #1 is expected to be an array or a sort flag in D:\ETMDatabase\User\ProjectsTable.php on line 147
    La ligne 147 correspondant au premier case de mon switch($order) .Après reflexion ça me paraît logique puisque ça ne pointe pas sur la même dimension du tableau $Tab...

    J'ai fait des recherches mais je n'ai pas trouvé ce qu'il fallait mettre en les []...
    Est-ce que au moins ma solution est viable ? Je suis encore débutant en PHP, alors n'hésitez pas à me le dire si je fais fausse route...

    Merci à ceux qui prendront le temps de réfléchir à mon problème

    David

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    hello,

    MySQL peut mettre les résultats dans l'ordre si tu le lui demande gentiment...

    SELECT truc FROM machin WHERE chose='bidule' ORDER BY truc

    par exemple...

    tu peux ajouter le sens d'ordonnancement (<- heu... c'est comme ca que ca se dit ?) si besoin est :

    ... ORDER BY truc ASC

    pour un tri ascendant

    ... ORDER BY truc DESC

    dans le cas contraire.

    Accessoirement tes dates, si elles sont enregistrées comme tu les affiches dans ton tableau, ne seront pas triables efficacement, ni par mySQL, ni par php... enregistre les si tu peux au format YYYY-MM-DD, et si tu peux pas... oublie le tri par date
    Pourfendeur de singletons en croisade

  3. #3
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    Salut

    En fait, il aurait fallu faire tes tableau comme ceci pour utiliser facilement array_multisort :
    $Tab['Name'][$i]
    $Tab['Phase'][$i]
    ...

    Avec ton tableau actuel, il te faut l'exploser comme ceci (extrait de la doc)


    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
    The data as an array, called data. This would  usually, for example, be obtained by looping with mysql_fetch_assoc(). 
        <?php
    $data[] = array('volume' => 67,  'edition' =>  2);
    $data[] = array('volume' => 86, 'edition' => 1);
    $data[] = array('volume' => 85, 'edition' => 6);
    $data[] = array('volume' => 98, 'edition' => 2);
    $data[] = array('volume' => 86, 'edition' => 6);
    $data[] = array('volume' => 67, 'edition' => 7);
    ?>  In this example, we will order by volume descending,  edition ascending. 
     We have an array of rows, but array_multisort()  requires an array of columns, so we use the below code to obtain the columns,  then perform the sorting. 
        <?php
    // Obtain a list of columns
    foreach  ($data as $key => $row) {
        $volume[$key]  = $row['volume'];
        $edition[$key] = $row['edition'];
    }
    
    // Sort the data with volume descending, edition ascending
    //  Add $data as the last parameter, to sort by the common key
    array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
    ?> 
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  4. #4
    Membre habitué Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Points : 168
    Points
    168
    Par défaut
    Je ne peux pas utiliser la fonction mysql car je forme le tableau grâce à deux requetes qui ne sont pas fusionnables...

    Par contre je peux très bien inverser les dimensions comme tu le suggères wamania, mais dans ce cas est-ce necessaire de mettre les crochets vides [] ?

    Si oui faut il mettre quelquechose dedans et quoi ?

  5. #5
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    non, plus besoin des [] alors
    Articles sur developpez.com
    - Gestion des exceptions avec PHP5
    - Chiffrement et hash en PHP contre l'attaque Man in the middle
    - Aedituus - Espace membre sécurisé en PHP5

  6. #6
    Membre habitué Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Points : 168
    Points
    168
    Par défaut
    Merki je vais tester ça

    Edit : CA MARCHE !!!

    MERCI !!

    (c'est rare que ça aille si vite )

  7. #7
    Membre habitué Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Points : 168
    Points
    168
    Par défaut
    Bonjour !


    J'ai crié victoire trop tôt...

    Ca trie bien en effet mais seulement ça met le foutoir dans le tableau et les lignes ne correspondent plus...

    Dans mon tableau j'ai 7 colonnes (cf 1er post), je pensais que la fonction faisait en sorte qu'elles gardent toujours la correspondance entre-elles mais ce n'est pas le cas. Comment puis-je remédier à cela ?

    Suis-je réellement obligé d'écrire pour chaque ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    array_multisort($Tab[1], SORT_DESC, SORT_STRING, $Tab[2], SORT_DESC,
     SORT_STRING, $Tab[3], SORT_DESC, SORT_STRING, $Tab[4], SORT_DESC, 
    SORT_STRING, $Tab[5], SORT_DESC, SORT_STRING, $Tab[6], SORT_DESC, 
    SORT_STRING, $Tab[7], SORT_DESC, SORT_STRING);
    puis si je veux trier sur un autre critère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    array_multisort($Tab[2], SORT_DESC, SORT_STRING, $Tab[1], SORT_DESC,
     SORT_STRING, $Tab[7], SORT_DESC, SORT_STRING, $Tab[6], SORT_DESC, 
    SORT_STRING, $Tab[5], SORT_DESC, SORT_STRING, $Tab[4], SORT_DESC,
     SORT_STRING, $Tab[3],SORT_DESC, SORT_STRING);
    ?

    Je pensais pouvoir ne donner que quelques critères et que les lignes resteraient constantes...
    Parce que imaginons que j'aie un tableau de 100 colonnes différentes ça peut vite devenir infernal avec cette méthode...


  8. #8
    Membre habitué Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Points : 168
    Points
    168
    Par défaut
    Je me permet un petit up...

    Il n'y a vraiment aucun moyen de trier un tableau bidimensionnel à plein de colonnes plus... "propre" que celui là ?

  9. #9
    Membre habitué Avatar de Davboc
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 266
    Points : 168
    Points
    168
    Par défaut
    Bon ben vu que j'ai pas eu de réponses j'ai fait le bourrin et j'ai ajouté une série d'arguments de type $Tab[i], SORT_DESC, SORT_STRING par colonne de mon tableau à 2 dimensions et ça marche...

    Mais je persiste à croire qu'il y a des solutions plus propres, reste à savoir lesquelles.

    Je mettrai résolu quand on en aura trouvé une ! NA !


  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Faut pas te fâcher tout rouge comme ça. Trèèès mauvais pour le coeur.

    La clé de tri de la fonction doit d'abord être constituée à partir du tableau de base. On oublie toujours ce détail pour cette fonction.

    Dans ton switch, essaye ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (...)
    case Name:
      foreach($Tab as $k=>$v){
        $cle[$k] = $v['Name'];
      }
      array_multisort($cle, SORT_ASC, $Tab);
      break;
    (...)
    Fais un essai simple (hors switch) pour bien comprendre la logique de cette fonction.
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/11/2011, 16h12
  2. [Tableaux] Problème de tri de tableau à 2 dimensions
    Par lebigboss dans le forum Langage
    Réponses: 1
    Dernier message: 09/05/2007, 16h34
  3. Réponses: 3
    Dernier message: 21/09/2006, 15h55
  4. [Tableaux] Problème pour contrôler un tableau
    Par renaud26 dans le forum Langage
    Réponses: 5
    Dernier message: 10/04/2006, 11h45
  5. [Tableaux] Problème de tri
    Par p0Kep0K dans le forum Langage
    Réponses: 2
    Dernier message: 23/02/2006, 16h21

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