Trier les tableaux
Il existe plusieurs façons de trier un tableau, par les valeurs, les clés, en ordre inverse, en conservant les associations clé-valeur. Il est possible de faire un tri plus naturel (plus humain), un tri avec une fonction utilisateur ou encore un tri multicritère.
Tri par valeur
Vous pouvez trier un tableau par ordre alphabétique avec la fonction sort() qui prend comme paramètre le tableau à trier. La fonction trie mais ne renvoie rien.
<?php
$tab = array('daniel','isabelle','david','robert', 'antoine');
sort($tab);
print_r($tab);
?>
Affichage
Array ( [0] => antoine [1] => daniel [2] => david [3] => isabelle [4] => robert )
Le comportement de tri peut être modifié par des constantes de tri à fourni en deuxième paramètre de la fonction.
- SORT_REGULAR : compare les éléments normalement (ne modifie pas les types)
- SORT_NUMERIC : compare les éléments numériquement
- SORT_STRING : compare les éléments comme des chaînes de caractères
- SORT_NATURAL – compare les éléments comme des chaînes de caractères en utilisant l’ordre nature comme le fait la fonction natsort()
- SORT_FLAG_CASE – peut être combiné (grâce à l’opérateur OR) avec sort_string ou sort_natural pour trier les chaînes sans tenir compte de la casse.
<?php
$tab = array('antoine1','antoine2','antoine3','antoine4', 'antoine10');
sort($tab,SORT_NATURAL);
print_r($tab);
echo '<br>';
$tab = array('antoine1','antoine2','antoine3','antoine4', 'antoine10');
sort($tab); // par défaut le tri se fait avec la constante SORT_REGULAR
print_r($tab);
?>
Affichage
Array ( [0] => antoine1 [1] => antoine2 [2] => antoine3 [3] => antoine4 [4] => antoine10 )
Array ( [0] => antoine1 [1] => antoine10 [2] => antoine2 [3] => antoine3 [4] => antoine4 )
Vous remarquez que dans le premier cas, le tri se fait de façon plus naturel.
Tri en ordre inverse
Vous pouvez trier un tableau en ordre inverse avec la fonction rsort() qui prend comme paramètre le tableau à trier.
<?php
$tab = array('daniel','isabelle','david','robert', 'antoine');
rsort($tab);
print_r($tab);
?>
Affichage
Array ( [0] => robert [1] => isabelle [2] => david [3] => daniel [4] => antoine )
Comme pour la fonction sort(), rsort() trie mais ne renvoie rien.
Association clé-valeur
Si vous voulez trier en conservant les associations clé-valeur, utilisez asort() au lieu de sort() pour trier par ordre alphabétique, et arsort() au lieu de rsort() pour trier en ordre inverse.
<?php
$tab = array('daniel1','isabelle2','david3','robert4', 'antoine5');
asort($tab);
print_r($tab);
?>
Affichage
Array ( [4] => antoine5 [0] => daniel1 [2] => david3 [1] => isabelle2 [3] => robert4 )
Vous remarquez que les valeurs rangées maintenant par ordre alphabétique ont conservé leurs clés initiales.
Trier par clé
Si vous voulez trier en fonction des clés et non pas des valeurs, utilisez ksort() au lieu de asort() pour trier par ordre alphabétique, et krsort() au lieu de arsort() pour trier en ordre inverse.
<?php
$tab = array('un'=>'daniel','deux'=>'isabelle','trois'=>'david','quatre'=>'robert');
ksort($tab);
print_r($tab);
?>
Affichage
Array ( [cinq] => antoine [deux] => isabelle [quatre] => robert [trois] => david [un] => daniel )
Vous remarquez que les valeurs sont rangées maintenant par ordre alphabétique des clés.
Tri naturel
Si vous souhaitez faire un tri plus humain, utilisez natsort()
<?php
$tab = array('antoine1','antoine2','antoine3','antoine4', 'antoine10');
natsort($tab);
print_r($tab);
echo '<br>';
$tab = array('antoine1','antoine2','antoine3','antoine4', 'antoine10');
sort($tab);
print_r($tab);
?>
Affichage
Array ( [0] => antoine1 [1] => antoine2 [2] => antoine3 [3] => antoine4 [4] => antoine10 )
Array ( [0] => antoine1 [1] => antoine10 [2] => antoine2 [3] => antoine3 [4] => antoine4 )
Vous remarquez que dans le premier cas les valeurs sont rangées de manière plus naturelle.
Tri insensible à la casse
La fonction natcasesort() est identique à natsort() mais fait une comparaison insensible à la casse.
<?php
$tab = array('antoine1','Antoine2','antoine3','Antoine4', 'antoine10');
natcasesort($tab);
print_r($tab);
echo '<br>';
$tab = array('antoine1','Antoine2','antoine3','Antoine4', 'antoine10');
natsort($tab);
print_r($tab);
?>
Affichage
Array ( [0] => antoine1 [1] => Antoine2 [2] => antoine3 [3] => Antoine4 [4] => antoine10 )
Array ( [1] => Antoine2 [3] => Antoine4 [0] => antoine1 [2] => antoine3 [4] => antoine10 )
Vous remarquez que dans le premier cas le tri est insensible à la casse.
Tri avec une fonction utilisateur
Si vous souhaitez faire un tri plus personnalisé, comme par exemple sur la taille des chaînes d’un tableau, vous pouvez utiliser la fonction usort(). Le premier paramètre est le tableau à trier et le deuxième est la fonction de comparaison. La fonction de comparaison accepte deux arguments qui sont comparés et doit retourner soit la valeur 1 (argument a > argument b), la valeur 0 (argument a == argument b), ou la valeur -1 (argument a < argument b).
<?php
function cmp($a,$b){
if(strlen($a) == strlen($b)){ // valeur précedente $a comparée à la valeur suivante $b
return 0;
}
return strlen($a)>strlen($b)?1:-1;
}
$tab = ['deux','un','quatre','trois','six'];
usort($tab,'cmp');
print_r($tab);
?>
Affichage
Array ( [0] => un [1] => six [2] => deux [3] => trois [4] => quatre )
Vous remarquez que le tri ne se fait pas sur les valeurs mais sur la taille (nombre de caractères) de chaque valeur.
Tri multicritère
Vous pouver trier un tableau par rapport au tri d’un autre tableau avec la fonction array_multisort(). Chaque valeur du premier est jumélée à chaque valeur du deuxième tableau.
<?php
$tab1 = ['deux','un','quatre','trois','six'];
$tab2 = ['deuxb','una','quatred','troisc','sixf'];
array_multisort($tab1,$tab2);
print_r($tab1);
echo '<br>';
print_r($tab2);
?>
Affichage
Array ( [0] => deux [1] => quatre [2] => six [3] => trois [4] => un )
Array ( [0] => deuxb [1] => quatred [2] => sixf [3] => troisc [4] => una )
Vous remarquez que le tri du premier tableau se fait sur les valeurs et que les entrées du second tableau correspondant aux valeurs jumelles du premier tableau.
Vous pouvez pour chaque tableau fournir des options de tri supplémentaires, les mêmes options qu’avec la fonction sort().
- SORT_REGULAR : compare les éléments normalement (ne modifie pas les types)
- SORT_NUMERIC : compare les éléments numériquement
- SORT_STRING : compare les éléments comme des chaînes de caractères
- SORT_NATURAL – compare les éléments comme des chaînes de caractères en utilisant l’ordre nature comme le fait la fonction natsort()
- SORT_FLAG_CASE – peut être combiné (grâce à l’opérateur OR) avec sort_string ou sort_natural pour trier les chaînes sans tenir compte de la casse.
<?php
$tab1 = ['deux','un','quatre','quatre','quatre','trois','six'];
$tab2 = ['deuxb','una','quatred','quatree','quatref','troisc','sixf'];
array_multisort($tab1,$tab2,SORT_DESC);
print_r($tab1);
echo '<br>';
print_r($tab2);
?>
Affichage
Array ( [0] => deux [1] => quatre [2] => quatre [3] => quatre [4] => six [5] => trois [6] => un )
Array ( [0] => deuxb [1] => quatref [2] => quatree [3] => quatred [4] => sixf [5] => troisc [6] => una )
Dans cet exemple, comme dans le précédent exemple, le tri du premier tableau se fait sur les valeurs et les entrées du second tableau correspondant aux valeurs jumelles du premier tableau, cependant lorsque les valeurs sont identiques sur le premier tableau (‘quatre’), les valeurs jumelées du deuxième tableau sont triées par ordre décroissant.