PHP:按数组值的长度对数组排序?

PHP:按数组值的长度对数组排序?,php,arrays,Php,Arrays,我做了一个拼字机,我有一系列的阳性匹配。问题是它们的顺序不同,我希望能够对数组进行排序,使最长的数组值首先出现 有人知道怎么做吗?使用 function sortByLength($a,$b){ if($a == $b) return 0; return (strlen($a) > strlen($b) ? -1 : 1); } usort($array,'sortByLength'); 使用此自定义函数 function sort($a,$b){ return strl

我做了一个拼字机,我有一系列的阳性匹配。问题是它们的顺序不同,我希望能够对数组进行排序,使最长的数组值首先出现

有人知道怎么做吗?

使用

function sortByLength($a,$b){
  if($a == $b) return 0;
  return (strlen($a) > strlen($b) ? -1 : 1);
}
usort($array,'sortByLength');
使用此自定义函数

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

这是我过去做过的一种方法

// Here's the sorting...
$array = array_combine($words, array_map('strlen', $words));
arsort($array);
很简单

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

如果您想用PHP5.3的方式,您可能需要创建如下内容:

usort($array, function($a, $b) {
    return strlen($b) - strlen($a);
});
这样,您就不会污染全局命名空间


但是,只有当您需要在源代码中的某个位置使用它以保持干燥时,才可以这样做。

用您的数组元素的
strlen
创建一个数组,并用数组进行
多排序

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

array_multisort($sort_numcie, $Yourarray);  

这肯定会奏效。我敢肯定

除了可接受的答案外,要按长度以升序或降序对数组进行排序:

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

PHP7就要来了。在PHP7中,可以使用

usort($array,function($a,$b){
返回strlen($b)strlen($a);
});

希望这能在将来对您有所帮助。

下面是一种使用spaceship操作符的方法(需要PHP 7.0):

array_multisort(array_map('count', $arr), SORT_DESC, $arr);
$arr=[‘苹果’、‘梨’、‘橙子’、‘香蕉’];
usort($arr,function($a,$b){return(strlen($a)strlen($b));};
印刷费($arr);
降序排列:

$array = ['aa', 'bb', 'c', 'ccc', 'a', 'ertre'];

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

var_export($array);

// Output
array (
  0 => 'ertre',
  1 => 'ccc',
  2 => 'aa',
  3 => 'bb',
  4 => 'c',
  5 => 'a',
)

$array = ['aa', 'bb', 'c', 'ccc', 'a', 'ertre'];

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

// Output
array (
  0 => 'c',
  1 => 'a',
  2 => 'aa',
  3 => 'bb',
  4 => 'ccc',
  5 => 'ertre',
)

这里面有个漏洞。你的平等条件太狭隘了。字符串“abc”和“def”应该从此排序返回0,但不会返回。他们将返回1。虽然我意识到这不是一个严重的错误(输出看起来不会被破坏,但在技术上是不准确的。“如果($a==b)返回0;”这是一个错误。我们谈论的是长度。@Peter和Thinker,是的,这是PHP手册的一个奇怪之处。我自己做了strlen($a)=strlen strlen($b),但后来我发现,由于PHP使用了不稳定的排序,这没关系!它仍然会打乱顺序。因此,我提出了最短的函数。它来自于基于手册的一些示例(如未知所述),因为我最近对php不感兴趣,所以没有费心去分析它,只是检查它是否有效。得到了更好的东西-很好。是的,手动示例和注释有时非常令人伤心,但我不知道它是否真的值得一提:)Cheerz。这很好,尽管我不会将该函数称为“排序”。下面的sortByLength更具描述性。对所有人来说-记住mb_strlen()-并不是所有的lang都是sameNo Brian,函数的工作不是排序,而是比较。因此,我将其称为ComparestLength Negatively。将其命名为“sort”并不重要,这不是因为描述性,而是因为致命错误:无法重新声明排序。为什么不使用mb_strlen而不是strlen?虽然比strlen慢,但一旦出现多字节值,它将防止头痛。请查看以提高您的格式化技能。将组合具有相同值的数组:数组(“aba”、“aa”、“ad”、“vcd”、“aba”);有意思,我不知道那件事。我想知道像@clttj建议的那样,仅仅使用减法是否有性能优势。
$array = ['aa', 'bb', 'c', 'ccc', 'a', 'ertre'];

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

var_export($array);

// Output
array (
  0 => 'ertre',
  1 => 'ccc',
  2 => 'aa',
  3 => 'bb',
  4 => 'c',
  5 => 'a',
)

$array = ['aa', 'bb', 'c', 'ccc', 'a', 'ertre'];

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

// Output
array (
  0 => 'c',
  1 => 'a',
  2 => 'aa',
  3 => 'bb',
  4 => 'ccc',
  5 => 'ertre',
)