PHP. Сортировка массива по длине его значений?
Я создал анаграмму, и у меня есть массив положительных совпадений. Проблема в том, что все они в другом порядке, я хочу иметь возможность сортировать массив, чтобы сначала отображались самые длинные значения массива.
У кого-нибудь есть идеи о том, как это сделать?
Ответы
Ответ 1
Используйте http://us2.php.net/manual/en/function.usort.php
с этой пользовательской функцией
function sort($a,$b){
return strlen($b)-strlen($a);
}
usort($array,'sort');
Используйте uasort, если вы хотите сохранить старые индексы, используйте usort, если вам все равно.
Кроме того, я считаю, что моя версия лучше, потому что usort является нестабильной сортировкой.
$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
Ответ 2
Если вы хотите сделать это с помощью PHP 5.3, вам может понадобиться создать что-то вроде этого:
usort($array, function($a, $b) {
return strlen($b) - strlen($a);
});
Таким образом, вы не будете загрязнять глобальное пространство имен.
Но делайте это только в том случае, если вам нужно в одном месте в исходном коде, чтобы сохранить вещи DRY.
Ответ 3
PHP7 подходит. В PHP7 вы можете использовать оператор Spaceship Operator.
usort($array, function($a, $b) {
return strlen($b) <=> strlen($a);
});
Надеюсь, это поможет вам в будущем.
Ответ 4
function sortByLength($a,$b){
if($a == $b) return 0;
return (strlen($a) > strlen($b) ? -1 : 1);
}
usort($array,'sortByLength');
Ответ 5
Создайте массив из strlen
элементов массива oyur и multisort
с вашим массивом.
foreach($Yourarray as $c=>$key) {
$key['maxlen'] = strlen($key);
$sort_numcie[] = $key['maxlen'];
}
array_multisort($sort_numcie, $Yourarray);
Это будет определенно работать. Я уверен!
Ответ 6
В дополнение к принятому ответу для сортировки массива по длине с возрастающим или убывающим порядком:
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;
}
Ответ 7
Вот как я это делал в прошлом.
// Here the sorting...
$array = array_combine($words, array_map('strlen', $words));
arsort($array);
Ответ 8
Это просто.
function LSort(a,b){return a.length-b.length;}
var YourArray=[[1,2,3,4,5,6], ['a','b'], ['X','Y','Z'], ['I','Love','You'], ['good man']];
YourArray.sort(Lsort);
Результат:
['good man'] Length=1
['a','b'] Length=3
['X','Y','Z'] Length=3
['I','Love','You'] Length=3
[1,2,3,4,5,6] Length=6