我正在尝试按每个值中的字符长度对数组进行排序(如果可能的话,如果两个值具有相同的字符长度,则可能按字母顺序排序)。例如:
Array ( [0] => this [1] => is [2] => a [3] => bunch [4] => of [5] => words;
我正在尝试将此数组排序为:
Array ( [0] => a [1] => is [2] => of [3] => this [4] => bunch [5] => words;
如何?
答案 0 :(得分:11)
这应该这样做:
array_multisort(array_map('strlen', $array), $array);
strlen()
array_map()
,获取数组中每个字符串的长度
array_multisort()
答案 1 :(得分:2)
看起来其他人已经回答了但是我开始写这篇文章所以我要发布它,当然! :)
您可以查看usort
$data = ["this", "is", "a", "bunch", "of", "words"];
usort($data, function($a, $b) {
$difference = strlen($a) - strlen($b);
return $difference ?: strcmp($a, $b);
});
我正在使用Elvis运算符?:
根据字符串长度返回差值,如果它不是0.如果它是0,则只返回strcmp
的返回值
答案 2 :(得分:1)
见:
$myarray = explode(" ", "this is a bunch of words");
usort($myarray, function($a, $b) { return strlen($a) - strlen($b) });
print_r($array);
说明:usort
在给定自定义比较器的情况下,对阵列(即通过引用)进行排序。如果第一项应该在第二项之前,则比较器必须返回负数,否则返回正数。值为0表示它们在订单上是相同的。
当长度相同时,您可以添加与strlen()无关的自定义条件。这取决于您,并且仅涉及额外的if
块。
重要的是要注意该函数必须定义一个订单关系,如数学所示:
答案 3 :(得分:1)
您可以使用自定义排序功能。
function mycmp($a, $b) {
$cmp = strlen($a) - strlen($b);
if ($cmp === 0)
$cmp = strcmp($a, $b);
return $cmp;
}
usort($array, 'mycmp');
答案 4 :(得分:0)
另一种方法:
$f = fn($s1, $s2) => strlen($s1) <=> strlen($s2);
usort($a, $f);