我制作了一个字谜生成器,并且我有一个正匹配的数组。问题是它们的顺序都不同,我想能够对数组进行排序,使最长的数组值首先出现。
有人有任何关于如何做到这一点的想法吗?
function sortByLength($a,$b){
return strlen($b)-strlen($a);
}
usort($array,'sortByLength');
$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
usort($array, function($a, $b) {
return strlen($b) - strlen($a);
});
PHP7即将到来。在PHP7中,您可以使用太空船操作符。
usort($array, function($a, $b) {
return strlen($b) <=> strlen($a);
});
希望这能在未来对你有所帮助。
function sortByLength($a,$b){
if($a == $b) return 0;
return (strlen($a) > strlen($b) ? -1 : 1);
}
usort($array,'sortByLength');
降序:
$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',
)
array_multisort(array_map('count', $arr), SORT_DESC, $arr);
创建一个由你的数组元素的 strlen
组成的数组,并使用 multisort
对其进行排序。
foreach($Yourarray as $c=>$key) {
$key['maxlen'] = strlen($key);
$sort_numcie[] = $key['maxlen'];
}
array_multisort($sort_numcie, $Yourarray);
这肯定会起作用。我很确定!
$key
是不直观的。在声明标量值为$key
之后立即声明关联元素$key['maxlen']
就很奇怪。$key['maxlen']
实际上是一个无用的变量声明。 - mickmackusa这里有一段代码片段,它清楚地说明了为什么你不应该在usort()
内部使用函数调用——你将会不必要地对之前遇到的值进行strlen()
调用。
在我的9个元素数组中,array_multisort()
调用strlen()
9次,但是usort()
调用strlen()
23次——这不太好。
代码:(演示)
function multisort($array) {
array_multisort(array_map('strlen', $array), SORT_DESC, $array);
printf(
"Total strlen() calls: %d\n%s\n---\n",
count($array),
var_export($array, true)
);
}
function usersort($array) {
usort(
$array,
function($a, $b) {
echo "strlen() called twice\n";
return strlen($b) <=> strlen($a);
}
);
var_export($array);
echo "\n---\n";
}
multisort($array);
usersort($array);
输出(来自我的示例数组):
Total strlen() calls: 9
array (
0 => 'eight',
1 => 'seven',
2 => 'three',
3 => 'five',
4 => 'four',
5 => 'nine',
6 => 'one',
7 => 'six',
8 => 'two',
)
---
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
strlen() called twice
array (
0 => 'three',
1 => 'seven',
2 => 'eight',
3 => 'four',
4 => 'five',
5 => 'nine',
6 => 'one',
7 => 'two',
8 => 'six',
)
---
除了已接受的答案外,要按长度对数组进行排序,可以选择升序或降序:
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;
}
这里有一种使用太空船运算符的方法(需要 PHP 7.0):
$arr = ['apple','pear','oranges','banana'];
usort($arr, function ($a, $b) { return (strlen($a) <=> strlen($b)); });
print_r($arr);