web-dev-qa-db-fra.com

PHP: Trier un tableau par la longueur de ses valeurs?

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?

51
Sam152

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
135
Unknown

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.

56
xlttj

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.

26
ZhenhangTung
function sortByLength($a,$b){
  if($a == $b) return 0;
  return (strlen($a) > strlen($b) ? -1 : 1);
}
usort($array,'sortByLength');
10
zalew

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! 

1
Moinkhan Pathan

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;
}
0
RafaSashi