J'ai fait une machine à anagramme et j'ai un tableau de correspondances positives. Le problème est qu'ils sont tous dans un ordre différent, je veux pouvoir trier le tableau pour que les valeurs les plus longues apparaissent en premier.
Quelqu'un a une idée sur la façon de procéder?
Utilisez http://us2.php.net/manual/en/function.usort.php
avec cette fonction personnalisée
function sort($a,$b){
return strlen($b)-strlen($a);
}
usort($array,'sort');
Utilisez uasort si vous voulez conserver les anciens index, utilisez usort si vous ne vous en souciez pas.
De plus, je pense que ma version est meilleure car usort est un type instable.
$array = array("bbbbb", "dog", "cat", "aaa", "aaaa");
// mine
[0] => bbbbb
[1] => aaaa
[2] => aaa
[3] => cat
[4] => dog
// others
[0] => bbbbb
[1] => aaaa
[2] => dog
[3] => aaa
[4] => cat
Si vous souhaitez utiliser la méthode PHP 5.3, vous souhaiterez peut-être créer quelque chose comme ceci:
usort($array, function($a, $b) {
return strlen($b) - strlen($a);
});
De cette façon, vous ne polluerez pas votre espace de noms global.
Mais ne faites cela que si vous en avez besoin à un seul endroit de votre code source pour garder les éléments au sec.
PHP7 arrive. En PHP7, vous pouvez utiliser le Spaceship Operator .
usort($array, function($a, $b) {
return strlen($b) <=> strlen($a);
});
J'espère que cela pourrait vous aider à l'avenir.
function sortByLength($a,$b){
if($a == $b) return 0;
return (strlen($a) > strlen($b) ? -1 : 1);
}
usort($array,'sortByLength');
Créez un tableau de strlen
de vos éléments de tableau et multisort
avec votre tableau.
foreach($Yourarray as $c=>$key) {
$key['maxlen'] = strlen($key);
$sort_numcie[] = $key['maxlen'];
}
array_multisort($sort_numcie, $Yourarray);
Cela fonctionnera certainement. Je suis sûr!
En plus de la réponse acceptée, pour trier un tableau par longueur avec croissant OR décroissant :
function strlen_compare($a,$b){
if(function_exists('mb_strlen')){
return mb_strlen($b) - mb_strlen($a);
}
else{
return strlen($b) - strlen($a);
}
}
function strlen_array_sort($array,$order='dsc'){
usort($array,'strlen_compare');
if($order=='asc'){
$array=array_reverse($array);
}
return $array;
}