[Résolu] Problème affichage tableau

Problème affichage tableau [Résolu] - PHP - Programmation

Marsh Posté le 12-06-2013 à 15:40:21    

Bonjour à tous,
 
Je me retrouve face à un problème et je ne comprends pas le pourquoi du comment.  
Je détails :
 
J'ai un tableau qui est construit en fonction d'un résultat de ma SP :
 

Code :
  1. $salaries[$i][0] = $data['ID_USERPREF'];
  2. $salaries[$i][1] = strtolower($data['perNom']);
  3. $salaries[$i][2] = $data['perPrenom'];
  4. $salaries[$i][3] = $data['orpOrder'];


 
Certes jusque là rien de bien compliqué, tout çà dans une boucle while et tout le tralala.
 
Mon problème arrive !
Je fais un joli  
 

Code :
  1. print_r($salaries);


 
Et voilà ce que je j'obtiens :
 

Code :
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [0] => 37
  6.             [1] => tartanpion
  7.             [2] => Marc
  8.             [3] => 0
  9.         )
  10.     [1] => Array
  11.         (
  12.             [0] => 55
  13.             [1] => Rosbeef
  14.             [2] => Yann
  15.             [3] => 0
  16.         )
  17.     [2] => Array
  18.         (
  19.             [0] => 7
  20.             [1] => Bon
  21.             [2] => Jean
  22.             [3] => 1
  23.         )
  24.     [3] => Array
  25.         (
  26.             [0] => 32
  27.             [1] => Hendrix
  28.             [2] => Jimi
  29.             [3] => 2
  30.         )
  31.     [4] => Array
  32.         (
  33.             [0] => 23
  34.             [1] => Guy
  35.             [2] => Buddy
  36.             [3] => 3
  37.         )
  38. )


 
Parfois, en plus c'est dans l'ordre que je veux !
Mais quand je veux écrire mon tableau pour faire tout joli, voilà l'ordre dans lequel çà m'affiche :
 

Code :
  1. B. Guy
  2. J. Bon
  3. J. Hendrix
  4. M. Tartanpion
  5. Y. Rosbeef


 
En gros par ordre alphabétique ... mes questions, pourquoi ? et comment faire pour changer çà ?  
 
Merci d'avance !


Message édité par stylix le 14-06-2013 à 11:31:45
Reply

Marsh Posté le 12-06-2013 à 15:40:21   

Reply

Marsh Posté le 12-06-2013 à 17:51:10    

Je pense que tu veux faire :
- un tri "complexe" (en fonction d'un sous-tableau)
- faire une boucle d'affichage
 
le Tri complexe est faisable via la fonction usort
Et la boucle, boucle d'affichage c'est pas trop dur non ?  (mais ce n'est pas print_r)
 
 
Tu peux nous montrer ta boucle d'affichage actuelle (elle semble exister non ?)


Message édité par dreameddeath le 12-06-2013 à 17:53:14
Reply

Marsh Posté le 13-06-2013 à 11:18:38    

Voilà ma boucle d'affichage  
 

Code :
  1. for($w=0;$w<count($salaries); $w++)
  2.      {
  3.       $this->display .= "<tr ";
  4.       if($_SESSION['userarray']['perID'] == $salaries[$w][0])
  5.        $this->display .= "class='selectedtd' ";
  6.       $this->display .= ">";
  7.       $this->display .= "<td>";
  8.        $this->display .=  substr($salaries[$w][2],0,1).". ".ucfirst($salaries[$w][1]);
  9.       $this->display .= "</td>";
  10.       $this->display .= "</tr>";
  11.      }


 
Je l'ai simplifié pour ici, car c'est cette partie qui nous intéresse.  
 
Je sais que ce n'est pas un print_r  ;)


---------------
Vous ne pouvez pas comprendre la récursivité sans avoir d’abord compris la récursivité.
Reply

Marsh Posté le 13-06-2013 à 11:20:51    

Ah j'ai failli oublié, le tri que je voudrai faire est sur cette clé : (celle en rouge, c'est mon ordre)
 

Code :
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [0] => 37
  6.             [1] => tartanpion
  7.             [2] => Marc
  8.             [3] => 0
  9.         )
  10.     [1] => Array
  11.         (
  12.             [0] => 55
  13.             [1] => Rosbeef
  14.             [2] => Yann
  15.             [3] => 0
  16.         )
  17.     [2] => Array
  18.         (
  19.             [0] => 7
  20.             [1] => Bon
  21.             [2] => Jean
  22.             [3] => 1
  23.         )
  24.     [3] => Array
  25.         (
  26.             [0] => 32
  27.             [1] => Hendrix
  28.             [2] => Jimi
  29.             [3] => 2
  30.         )
  31.     [4] => Array
  32.         (
  33.             [0] => 23
  34.             [1] => Guy
  35.             [2] => Buddy
  36.             [3] => 3
  37.         )
  38. )


Message édité par stylix le 13-06-2013 à 11:21:11

---------------
Vous ne pouvez pas comprendre la récursivité sans avoir d’abord compris la récursivité.
Reply

Marsh Posté le 13-06-2013 à 13:06:27    

Je ne suis pas sûr de comprendre : tu dis que le tableau "change d'ordre" en cours de route, c'est ça ?
 
Si c'est le cas, c'est bizarre. Sinon, comme je l'ai déjà écrit, il suffit d'utiliser usort pour des tri arbitrairement complexes (et foreach est plus propre/lisible que for($i=0;$i<count(...);$i++)
 
Exemple :

Code :
  1. usort($salarie,
  2.     function($a,$b){
  3.         return ($a[3]>$b[3])?1:(($a[3]<$b[3])?-1:0); // compare le 3ème champ du tableau
  4.     });
  5. foreach($salaries as $salarie){
  6.     echo '<div>'.$salarie[1].' '.$salarie[2]. '</div>'.PHP_EOL;
  7. }


Message édité par dreameddeath le 13-06-2013 à 14:21:13
Reply

Marsh Posté le 13-06-2013 à 14:14:10    

En fait quand je dis change d'ordre, c'est pas vraiment ce que je veux ire (je sais je suis tordu :P)
Disons que je voudrai savoir si c'est normal que quand je fais un print_r, mon tableau est affiché dans un certain ordre, mais quand je l'affiche dans ma boucle, il est dans un autre ...
 
Pourquoi il ne garde pas le même ordre que l'affichage du print_r ?
 
Je vais essayé ton bout de code ;)


---------------
Vous ne pouvez pas comprendre la récursivité sans avoir d’abord compris la récursivité.
Reply

Marsh Posté le 13-06-2013 à 15:08:56    

Ton code marche, mais pas avec mon tableau...
Je m'explique :

 

Je met ton code, j'ai bien l'ordre que je veux.

 
Code :
  1. usort($salarie,
  2.  function($a,$b){
  3.   return ($a[3]>$b[3])?1:(($a[3]<$b[3])?-1:0); // compare le 3ème champ du tableau
  4.  });
  5.  foreach($salaries as $salarie){
  6.   echo '<div>'.$salarie[1].' '.$salarie[2]. '</div>'.PHP_EOL;
  7.  }
 

Me donne bien :

Code :
  1. tartanpion
  2. Yann
  3. Jean
  4. Jimi
  5. Buddy
 

Mais avec mon tableau çà me donne :

 
Code :
  1. foreach($salaries as $salarie){
  2.       $this->display .= "<tr ";
  3.       if($_SESSION['userarray']['perID'] == $salarie[0])
  4.        $this->display .= "class='selectedtd' ";
  5.       $this->display .= ">";
  6.       $this->display .= "<td>";
  7.        $this->display .=  substr($salarie[2],0,1).". ".ucfirst($salarie[1]);
  8.       $this->display .= "</td>";
  9.       for($i=0; $i<$nbjou +1; $i++)
  10.       {
  11.        $jour=$datedebut+($i*60*60*24);
  12.        $jourDate = date('d/m/Y', $jour);
  13.        $this->display .= "<td id='".$jourDate."' name='".$jourDate."' ";
  14.        if(date('w',$jour) == "0" || date('w',$jour) == "6" )
  15.         $this->display .= " style='background-color: ".$weekend.";' ";
  16.        // gestion jours fériés
  17.        $key=false;
  18.        $value=$jour;
  19.        $key = in_array($value,(array)$ferie); // $key = 2;
  20.        if($key)
  21.         $this->display .= " style='background-color: ".$feriecolor.";' ";
  22.        $this->display .= " >";
  23.        $this->display .= "</td>";
  24.       }
  25.       $this->display .= "</tr>";
  26.      }
 

Et mais çà s'affiche par ordre alphabétique ...

  



Message édité par stylix le 13-06-2013 à 15:09:42

---------------
Vous ne pouvez pas comprendre la récursivité sans avoir d’abord compris la récursivité.
Reply

Marsh Posté le 13-06-2013 à 15:55:55    

alors là je sèche... C'est la première fois que j'entends parler d'un tableau php qui se "réorganise" entre 2 lignes de codes sans modif/tri...
 
Si tu fais un

Code :
  1. $this->display.='<tr><td>'.print_r($salaries,true).'</td><td></td></tr>'.PHP_EOL;
  2. foreach(...){
  3.     ...
  4. }


 
ça donne quoi ?


Message édité par dreameddeath le 13-06-2013 à 15:56:09
Reply

Marsh Posté le 13-06-2013 à 16:11:51    

Bah quand je fais çà, la première ligne, le print_r, me donne bien ma ligne dans le bon ordre, et dès que j'arrive dans le foreach çà se barre en vrac ....
Incompréhensible !
 
Question annexe : a quoi sert le

Code :
  1. .PHP_EOL

?


---------------
Vous ne pouvez pas comprendre la récursivité sans avoir d’abord compris la récursivité.
Reply

Marsh Posté le 13-06-2013 à 16:22:54    

J'essaye de te donner plus de détails :  
 
Je mets ton code :
 

Code :
  1. usort($salarie,
  2.  function($a,$b){
  3.   return ($a[3]>$b[3])?1:(($a[3]<$b[3])?-1:0); // compare le 3ème champ du tableau
  4.  });
  5.  foreach($salaries as $salarie){
  6.   echo '<div>'.$salarie[1].' '.$salarie[2]. '</div>'.PHP_EOL;
  7.  }


 
J'obtiens çà :
 

Code :
  1. tartanpion
  2. Yann
  3. Jean
  4. Jimi
  5. Buddy


 
Et voilà juste en dessous ce qu'il y a :  
 

Code :
  1. $this->display .= "
  2. <table>
  3. <thead>
  4. <tr>
  5.  <th></th>";
  6.  $mois = array("","Jan","Fev","Mar","Avr","Mai","Juin","Jui","Aout","Sep","Oct","Nov","Dec" );
  7.  for($i=0; $i<$nbjou+1; $i++)
  8.  {
  9.   $jour=$datedebut+($i*60*60*24);
  10.   $this->display .= "<th>";
  11.   $this->display .= $mois[date('n',$jour)]." ".date('Y',$jour);
  12.   $this->display .= "</th>";
  13.  }
  14.  $this->display .= "
  15.  </tr>
  16.  <tr>
  17.   <th> Salaries </th> ";
  18.    for($i=0; $i<$nbjou+1; $i++)
  19.    {
  20.     $jour=$datedebut+($i*60*60*24);
  21.     $this->display .= "<th ";
  22.     if($datedujour == date('Y-m-d', $jour))
  23.      $this->display .= "style='color:red;font-size:20px;' ";
  24.     $this->display .= ">";
  25.     if($datedujour == date('Y-m-d', $jour))
  26.      $this->display .= "<span id='datedujour' name='datedujour'></span> ";
  27.     $this->display .=  $joursemaine[date('w',$jour)].' '.date("d",$jour);
  28.     $this->display .= "</th>";
  29.    }
  30.   $this->display .= "</tr>
  31.  </thead>
  32.  <tbody> ";
  33.    $weekend="#D7DDEF";
  34.    foreach($salaries as $salarie){
  35.     $this->display .= "<tr ";
  36.     if($_SESSION['userarray']['perID'] == $salarie[0])
  37.       $this->display .= "class='selectedtd' ";
  38.     $this->display .= ">";
  39.     $this->display .= "<td>";
  40.       $this->display .=  substr($salarie[2],0,1).". ".ucfirst($salarie[1]);
  41.     $this->display .= "</td>";
  42.     for($i=0; $i<$nbjou +1; $i++)
  43.     {
  44.       $jour=$datedebut+($i*60*60*24);
  45.       $jourDate = date('d/m/Y', $jour);
  46.       $this->display .= "<td id='".$jourDate."' name='".$jourDate."' ";
  47.       if(date('w',$jour) == "0" || date('w',$jour) == "6" )
  48.     $this->display .= " style='background-color: ".$weekend.";' ";
  49.       // gestion jours fériés
  50.       $key=false;
  51.       $value=$jour;
  52.       $key = in_array($value,(array)$ferie); // $key = 2;
  53.       if($key)
  54.     $this->display .= " style='background-color: ".$feriecolor.";' ";
  55.       $this->display .= " >";
  56.       $this->display .= "</td>";
  57.     }
  58.     $this->display .= "</tr>";
  59.     }
  60.  $this->display .= "</tbody>
  61. </table>";


 
Et là mon ordre devient :  
 

Code :
  1. Buddy
  2. Jean
  3. Jimi
  4. tartanpion
  5. Yann


 
 :ouch:  :ouch:  :heink:  :heink:  
 


---------------
Vous ne pouvez pas comprendre la récursivité sans avoir d’abord compris la récursivité.
Reply

Marsh Posté le 13-06-2013 à 16:22:54   

Reply

Marsh Posté le 13-06-2013 à 17:02:13    

Mais je ne vois pas l'appel à "usort" dans ton code (le complet).
 
Et sinon, il vaut vraiment mieux faire appel à un moteur de template (twig, smarty...) c'est quand même plus lisible


Message édité par dreameddeath le 13-06-2013 à 17:03:36
Reply

Marsh Posté le 13-06-2013 à 17:28:01    

Il y est c'est moi qui ai fauté au moment du copier coller. Il est juste avant la bouche for, comme dans ton exemple ...
 
Je sais que c'est plus propre avec un moteur de template mais projet professionnel cela a été décidé de faire sans ....
 
Bon bah je crois que çà va rester un mystère !  :??:  :??:


---------------
Vous ne pouvez pas comprendre la récursivité sans avoir d’abord compris la récursivité.
Reply

Marsh Posté le 14-06-2013 à 11:29:55    

Bon aller ce matin j'étais de bonne humeur, et je me suis dis je vais résoudre ce problème !
Et je l'ai résolu, quand j'ai trouvé la solution, en à peu près 10 secondes, je me suis dis, je vais me mettre une balle dans la tête !  :fou:  
 
Côté PHP tout est parfait ! Mais j'avais un petit détail, vraiment léger, j'utilise le plugin Datatables pour mon tableau, et ce c**, il tri le tableau tout seul !
 
Conclusion, je suis un boulet  :sweat:  
 
En tout cas merci quand même pour le usort, je ne me suis pas couché débile !  :pt1cable:


---------------
Vous ne pouvez pas comprendre la récursivité sans avoir d’abord compris la récursivité.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed