par
Cyrano » 05 mars 2006, 10:51
Ok, on va y aller par étapes.
Pour commencer, créons un tableau à deux dimensions stockat des prénoms et des points :
<?php
/* Prenons un tableau comportant une liste de prénoms et de points */
$liste = array("prenom" => array("Jean", "Pierre", "Robert", "Jacques", "Sylvain"), "points" => array(12, 25, 16, 8, 16));
/* Premier affichage */
?>
<pre>
<?php
var_dump($liste);
?>
</pre>
L'affichage du tableau non trié donne ceci :
Code : Tout sélectionner
array(2) {
["prenom"]=>
array(5) {
[0]=>
string(4) "Jean"
[1]=>
string(6) "Pierre"
[2]=>
string(6) "Robert"
[3]=>
string(7) "Jacques"
[4]=>
string(7) "Sylvain"
}
["points"]=>
array(5) {
[0]=>
int(12)
[1]=>
int(25)
[2]=>
int(16)
[3]=>
int(8)
[4]=>
int(16)
}
}
Avec la fonction
array_multisort(), trions ce tableau :
<?php
/* On doit commencer par classer ce tableau selon les points dans l'ordre décroissant */
array_multisort($liste['points'], SORT_DESC, SORT_NUMERIC,
$liste['prenom'], SORT_ASC, SORT_STRING);
/* Affichage après le tri */
?>
<pre>
<?php
var_dump($liste);
?>
</pre>
L'affichage de contrôle donne ceci:
Code : Tout sélectionner
array(2) {
["prenom"]=>
array(5) {
[0]=>
string(6) "Pierre"
[1]=>
string(6) "Robert"
[2]=>
string(7) "Sylvain"
[3]=>
string(4) "Jean"
[4]=>
string(7) "Jacques"
}
["points"]=>
array(5) {
[0]=>
int(25)
[1]=>
int(16)
[2]=>
int(16)
[3]=>
int(12)
[4]=>
int(8)
}
}
Les données sont maintenant classées dans le bon ordre, il ne reste qu'à les afficher dans un tableau en ajoutant le classement correspondant: nous avons deux ex-aequo à la deuxième place. Pour gérer ça et repartir ensuite sur 4 et non trois, on va créer des variables de stockage temporaire et utiliser le pointeur de la boucle for() utilisée pour parcourir le tableau $liste.
<?php
/* Nous allons maintenant afficher en ajoutant un classement tenant compte des exaequos. */
?>
<table summary="">
<tr>
<th><p>Classement</p></th>
<th><p>Prénom</p></th>
<th><p>Points</p></th>
</tr>
<?php
/* On commence par compter le nombre de candidats au classement */
$nb = count($liste['prenom']);
/**
* On crée deux variables :
* - une variable de stockage temporaire du nombre de points : cette variable va
* servir à déterminer si on doit incrémenter le classement ou non
* - Un seconde pour stocker le classement
*/
$pt = 0;
$cl = 0;
for($i = 0; $i < $nb; $i++)
{
/* Si le nombre de points est différent de $pt, on incrémente $cl par
rapport au pointeur de la boucle for() et on modifie la valeur de $pt */
if($liste['points'][$i] != $pt)
{
$cl = $i + 1;
$pt = $liste['points'][$i];
}
?>
<tr>
<td><p><?php echo($cl); ?></p></td>
<td><p><?php echo($liste['prenom'][$i]); ?></p></td>
<td><p><?php echo($liste['points'][$i]); ?></p></td>
</tr>
<?php
}
?>
</table>
Ce qui va me donner le tableau suivant :
Code : Tout sélectionner
+------------+------------+----------+
| Classement | Prénom | Points |
+------------+------------+----------+
| 1 | Pierre | 25 |
| 2 | Robert | 16 |
| 2 | Sylvain | 16 |
| 4 | Jean | 12 |
| 5 | Jacques | 8 |
+------------+------------+----------+
Voilà, est-ce que tu comprends le fonctionnement de tout ceci ? Le moins simple à saisir, c'est l'utilisation de
array_multisort(), le reste, c'est juste de la logique.
Ok, on va y aller par étapes.
Pour commencer, créons un tableau à deux dimensions stockat des prénoms et des points :
[php]<?php
/* Prenons un tableau comportant une liste de prénoms et de points */
$liste = array("prenom" => array("Jean", "Pierre", "Robert", "Jacques", "Sylvain"), "points" => array(12, 25, 16, 8, 16));
/* Premier affichage */
?>
<pre>
<?php
var_dump($liste);
?>
</pre>[/php]
L'affichage du tableau non trié donne ceci :
[code]array(2) {
["prenom"]=>
array(5) {
[0]=>
string(4) "Jean"
[1]=>
string(6) "Pierre"
[2]=>
string(6) "Robert"
[3]=>
string(7) "Jacques"
[4]=>
string(7) "Sylvain"
}
["points"]=>
array(5) {
[0]=>
int(12)
[1]=>
int(25)
[2]=>
int(16)
[3]=>
int(8)
[4]=>
int(16)
}
}[/code]
Avec la fonction [url=http://fr3.php.net/manual/fr/function.array-multisort.php][b]array_multisort()[/b][/url], trions ce tableau :
[php]<?php
/* On doit commencer par classer ce tableau selon les points dans l'ordre décroissant */
array_multisort($liste['points'], SORT_DESC, SORT_NUMERIC,
$liste['prenom'], SORT_ASC, SORT_STRING);
/* Affichage après le tri */
?>
<pre>
<?php
var_dump($liste);
?>
</pre>[/php]
L'affichage de contrôle donne ceci:
[code]array(2) {
["prenom"]=>
array(5) {
[0]=>
string(6) "Pierre"
[1]=>
string(6) "Robert"
[2]=>
string(7) "Sylvain"
[3]=>
string(4) "Jean"
[4]=>
string(7) "Jacques"
}
["points"]=>
array(5) {
[0]=>
int(25)
[1]=>
int(16)
[2]=>
int(16)
[3]=>
int(12)
[4]=>
int(8)
}
}[/code]
Les données sont maintenant classées dans le bon ordre, il ne reste qu'à les afficher dans un tableau en ajoutant le classement correspondant: nous avons deux ex-aequo à la deuxième place. Pour gérer ça et repartir ensuite sur 4 et non trois, on va créer des variables de stockage temporaire et utiliser le pointeur de la boucle for() utilisée pour parcourir le tableau $liste.
[php]<?php
/* Nous allons maintenant afficher en ajoutant un classement tenant compte des exaequos. */
?>
<table summary="">
<tr>
<th><p>Classement</p></th>
<th><p>Prénom</p></th>
<th><p>Points</p></th>
</tr>
<?php
/* On commence par compter le nombre de candidats au classement */
$nb = count($liste['prenom']);
/**
* On crée deux variables :
* - une variable de stockage temporaire du nombre de points : cette variable va
* servir à déterminer si on doit incrémenter le classement ou non
* - Un seconde pour stocker le classement
*/
$pt = 0;
$cl = 0;
for($i = 0; $i < $nb; $i++)
{
/* Si le nombre de points est différent de $pt, on incrémente $cl par
rapport au pointeur de la boucle for() et on modifie la valeur de $pt */
if($liste['points'][$i] != $pt)
{
$cl = $i + 1;
$pt = $liste['points'][$i];
}
?>
<tr>
<td><p><?php echo($cl); ?></p></td>
<td><p><?php echo($liste['prenom'][$i]); ?></p></td>
<td><p><?php echo($liste['points'][$i]); ?></p></td>
</tr>
<?php
}
?>
</table>[/php]
Ce qui va me donner le tableau suivant :
[code]+------------+------------+----------+
| Classement | Prénom | Points |
+------------+------------+----------+
| 1 | Pierre | 25 |
| 2 | Robert | 16 |
| 2 | Sylvain | 16 |
| 4 | Jean | 12 |
| 5 | Jacques | 8 |
+------------+------------+----------+[/code]
Voilà, est-ce que tu comprends le fonctionnement de tout ceci ? Le moins simple à saisir, c'est l'utilisation de [url=http://fr3.php.net/manual/fr/function.array-multisort.php][b]array_multisort()[/b][/url], le reste, c'est juste de la logique.