Подтвердить что ты не робот

PHP. Сортировка массива по длине его значений?

Я создал анаграмму, и у меня есть массив положительных совпадений. Проблема в том, что все они в другом порядке, я хочу иметь возможность сортировать массив, чтобы сначала отображались самые длинные значения массива.

У кого-нибудь есть идеи о том, как это сделать?

4b9b3361

Ответ 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