trier un tableau

Mammouth du PHP | 536 Messages

09 août 2007, 09:48

Bonjour tout le monde.

J'ai du mal avec les tableaux (je ne comprends pas tout).
Je voudrais trier mon tableau en fonction du critère 'mark', j'ai pu voir qu'il y a des fonction pour trier un tableau mais je ne vois as comment les utiliser.

Voici le code de mon tableau :
<?
$arrayItem = array();
  $arrayPractice[$idItem]['id'] = $idItem;
  $arrayPractice[$idItem]['viewed'] = $viewed;
  $arrayPractice[$idItem]['used'] = $used;
  $arrayPractice[$idItem]['mark'] = $mark;
  $arrayPractice[$idItem]['name'] = $name;
?>
Si quelqu'un pouvait m'aider...
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

d0m
Mammouth du PHP | 1141 Messages

09 août 2007, 10:02

exemple 386

C'est exactement ce que tu veux.

Mammouth du PHP | 536 Messages

09 août 2007, 10:06

oui j'avais vu cette fonction array_multisort() mais je ne vois pas comment l'utiliser.
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

d0m
Mammouth du PHP | 1141 Messages

09 août 2007, 10:25

pourtant le code est donné dans l'exemple 386 il suffit de changer les noms des variables et l'ordre de tri.

Pour toi ca donnerait ça :
<?php
// Obtient une liste de colonnes
foreach ($arrayItem as $key => $row) {
  $tab_idItem[$key]  = $row['volume']; 
  $tab_viewed[$key]  = $row['viewed'];
  $tab_used[$key]    = $row['used'];
  $tab_mark[$key]    = $row['mark'];
  $tab_name[$key]    = $row['name'];
}

// Trie les données par mark croissant
// Ajoute $arrayItem en tant que dernier paramètre, pour trier par la clé commune
array_multisort($tab_mark, SORT_ASC, $arrayItem );
?> 

Mammouth du PHP | 536 Messages

09 août 2007, 10:32

J'avais fait comme ca :
<? array_multisort($arrayItem[2], SORT_ASC, SORT_STRING); ?>
en passant dans le tableau le numéro de l'attribut avec lequel on souhaite faire le tri. Ici avec 2 ca me faisait le tri en fonction de l'attribut 'viewed'.
Mais était-ce correct ?

Et est-il possible d'afficher par exemple que les 3 premiers ?
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

d0m
Mammouth du PHP | 1141 Messages

09 août 2007, 11:05

la définition de tes tableaux est un peu flou, une fois tu as $arrayItem et une autre $arrayPractice...

pour faire un array_multisort sur un tableau de cette manière :
array_multisort($arrayItem[2], SORT_ASC, SORT_STRING);
Il faut que $arrayItem a la structure :

Code : Tout sélectionner

array(5) { [0]=> array(x) { [0]=> .. [1]=> .. [2]=> .. ... } [1]=> array(x) { [0]=> .. [1]=> .. [2]=> .. ... } [2]=> array(x) {//le tableau contenant les valeurs de viewed [0]=> .. [1]=> .. [2]=> .. .. } [3]=> array(x) { [0]=> .. [1]=> .. [2]=> .. .. } [4]=> array(x) { [0]=> .. [1]=> .. [2]=> .. .. } }

Mammouth du PHP | 536 Messages

09 août 2007, 11:11

non, c bien arrayItem

Sinon, j'ai la bonne forme du tableau, (trié par mark)

Code : Tout sélectionner

Array ( [0] => Array ( [id] => 9 [viewed] => 1 [used] => 0 [mark] => 4.5 [name] => nom9 ) [1] => Array ( [id] => 8 [viewed] => 2 [used] => 0 [mark] => 2.3 [name] => nom8 ) [2] => Array ( [id] => 1 [viewed] => 9 [used] => 0 [mark] => 0 [name] => nom1 ) [3] => Array ( [id] => 2 [viewed] => 8 [used] => 0 [mark] => 0 [name] => nom2 ) [4] => Array ( [id] => 3 [viewed] => 7 [used] => 0 [mark] => 0 [name] => nom3 ) [5] => Array ( [id] => 4 [viewed] => 6 [used] => 0 [mark] => 0 [name] => nom4 ) [6] => Array ( [id] => 5 [viewed] => 5 [used] => 0 [mark] => 0 [name] => nom5 ) [7] => Array ( [id] => 6 [viewed] => 4 [used] => 0 [mark] => 0 [name] => nom6 ) [8] => Array ( [id] => 7 [viewed] => 3 [used] => 0 [mark] => 0 [name] => nom7 ) )
donc la méthode que j'ai proposé aurait pu marcher. Tant ps, j'ai adopté la tienne.

Mais sinon peut-on limiter l'affichage à seulement les 3 premiers ? La fonction array_multisort ne permet pas de faire ceci.

EDIT :
réponse à moi-même, oui on peut de cette facon :
<?
$i=0;
foreach ($arrayItem as $idItem=>$Item){
      if ( $i == 3) { break; }
      else { .... }
      $i++;
}
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

d0m
Mammouth du PHP | 1141 Messages

09 août 2007, 11:24

avec ta structure de tableau, en faisant

Code : Tout sélectionner

array_multisort($arrayItem[2], SORT_ASC, SORT_STRING);
Il va te trier la 2ème colonne c'est à dire le tableau

Code : Tout sélectionner

[2] => Array ( [id] => 1 [viewed] => 9 [used] => 0 [mark] => 0 [name] => nom1 )
en

Code : Tout sélectionner

[2] => Array ( [used] => 0 [mark] => 0 [id] => 1 [viewed] => 9 [name] => nom1 )
et les autres items idem
Mais sinon peut-on limiter l'affichage à seulement les 3 premiers?
Ce n'est pas de l'ordre du tri, tu parcours ton tableau et tu affiches que les 3 premiers (en utilisant un compteur par exemple).