Page 1 sur 1

trier un tableau

Posté : 09 août 2007, 09:48
par béka
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...

Posté : 09 août 2007, 10:02
par d0m
exemple 386

C'est exactement ce que tu veux.

Posté : 09 août 2007, 10:06
par béka
oui j'avais vu cette fonction array_multisort() mais je ne vois pas comment l'utiliser.

Posté : 09 août 2007, 10:25
par d0m
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 );
?> 

Posté : 09 août 2007, 10:32
par béka
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 ?

Posté : 09 août 2007, 11:05
par d0m
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]=> .. .. } }

Posté : 09 août 2007, 11:11
par béka
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++;
}

Posté : 09 août 2007, 11:24
par d0m
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).