2009-05-08 3 views
45

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

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

ответ

124

Использование 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 
+13

Это хорошо, хотя я бы не назвал функцию просто «сортировкой». sortByLength ниже более описательна. –

+5

всем - помните о mb_strlen() - не все langs одинаковы – Jeffz

+0

Нет Брайана, задача функции не сортировать, а сравнивать. Поэтому я бы назвал это compareStrLengthNegatively – fishbone

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

В этом есть ошибка. Ваше условие равенства слишком узкое. Строки «abc» и «def» должны возвращать 0 из этого типа, но не будут. Вместо этого они вернутся 1. И хотя я понимаю, что это не серьезная ошибка (результат не будет выглядеть * сломанным, это технически неточно. –

+1

'if ($ a == $ b) return 0;' this is ошибка. Мы говорим о длине. – Thinker

+0

@ Peter and Thinker, да, это странность руководства PHP. Я сам сделал strlen ($ a) == strlen ($ b), но потом увидел, что, поскольку PHP использует нестабильную сортировка, это не имеет значения! Это все еще испортит заказ. Поэтому я придумал кратчайшую функцию, которая работает. – Unknown

-1

Вот как я это делал в прошлом.

// Here's the sorting... 
$array = array_combine($words, array_map('strlen', $words)); 
arsort($array); 
+0

массив с таким же значением будет объединен: array (" aba "," aa "," ad "," vcd "," aba "); –

-5

Это просто.

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 
+11

PHP! = JavaScript. –

+2

Пожалуйста, взгляните на [эту страницу справки Markdown] (http://stackoverflow.com/editing-help), чтобы улучшить свои навыки форматирования. – Gumbo

49

Если вы хотите сделать это PHP 5.3 так, вы можете создать что-то вроде этого:

usort($array, function($a, $b) { 
    return strlen($b) - strlen($a); 
}); 

Таким образом, вы выиграли» t загрязняет ваше глобальное пространство имен.

Но делайте это только в том случае, если вам это нужно в одном месте в исходном коде, чтобы держать вещи сухими.

1

Сделать массив из strlen элементов массива oyur и multisort его с вашим массивом.

foreach($Yourarray as $c=>$key) {    
    $key['maxlen'] = strlen($key); 
    $sort_numcie[] = $key['maxlen']; 
} 

array_multisort($sort_numcie, $Yourarray); 

Это, безусловно, будет работать. Я уверен!

0

В дополнении к принятому ответу, для сортировки массива по длине с по возрастанию или по убыванию:

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; 
} 
16

PHP7 приходит. В PHP7 вы можете использовать Spaceship Operator.

usort($array, function($a, $b) { 
    return strlen($b) <=> strlen($a); 
}); 

Надеюсь, это поможет вам в будущем.

Смежные вопросы