我正试图先按长度排序,然后按字母顺序对单词进行排序。
// from
$array = ["dog", "cat", "mouse", "elephant", "apple"];
// to
$array = ["cat", "dog", "apple", "mouse", "elephant"];
我见过this answer,但它是Java,this answer,但它只处理按长度排序。我尝试使用答案中提供的代码按长度排序,然后按字母顺序排序,但之后按字母顺序排序。
如何按长度排序,然后按字母顺序排序?
答案 0 :(得分:9)
您可以将这两个条件放入usort
比较函数中。
usort($array, function($a, $b) {
return strlen($a) - strlen($b) ?: strcmp($a, $b);
});
按多个条件排序的一般策略是为每个条件写入比较表达式,返回比较函数的相应返回类型(整数,正数,负数或零,具体取决于比较结果),并按照您所需的排序顺序对它们进行评估,例如第一个长度,然后按字母顺序排列。
如果表达式的计算结果为零,那么这两个项在该比较方面是相等的,并且应该计算下一个表达式。如果不是,那么该表达式的值可以作为比较函数的值返回。
这里的另一个答案似乎暗示这个比较函数不会返回大于,小于或等于零的整数。确实如此。
答案 1 :(得分:2)
注意:我没有及早发布我的回答,因为@不要比我更快恐慌。但是,我想在他的答案中添加一些解释(希望,这将有助于更多的理解)。
usort($array, function($a, $b) {
return strlen($a) - strlen($b) ?: strcmp($a, $b);
});
确定。函数usort等待自定义比较函数(来自docs):
比较函数必须返回小于,等于或的整数 如果第一个参数被认为是大于零 分别小于,等于或大于第二个。
好的,重写@不要惊慌于此视图的代码(根据上述条件):
usort($array, function($a, $b) {
// SORT_ORDER_CONDITION_#1
// equals -> going to next by order sort-condition
// in our case "sorting alphabetically"
if (strlen($a) == strlen($b)){
// SORT_ORDER_CONDITION_#2
if (strcmp($a,$b)==0) // equals - last sort-condition? Return 0 ( in our case - yes)
return 0; //
return (strcmp($a,$b)) ? -1 : 1;
}else{
return (strlen($a) < strlen ($b) ) ? - 1 : 1;
}
});
具有多种排序条件的“常见排序策略”(摘要),如(CON_1,CON_2... CON_N)
:
usort($array, function(ITEM_1, ITEM_2) {
// SORT_ORDER_CONDITION_#1
if (COMPARING_1_EQUALS){
// SORT_ORDER_CONDITION_#2
if (COMPARING_2_EQUALS){ // If last con - return 0, else - going "deeper" ( to next in order)
//...
// SORT_ORDER_CONDITION_#N
if (COMPARING_N_EQUALS) // last -> equals -> return 0;
return 0;
return ( COMPARING_N_NOT_EQUALS) ? -1 : 1;
//...
}
return ( COMPARING_2_NOT_EQUALS) ? -1 : 1;
}else{
return ( COMPARING_1_NOT_EQUALS ) ? - 1 : 1;
}
});
在实践中(来自我的exp),它按几个条件对无序多维数组进行排序。您可以像上面一样使用usort
。
答案 2 :(得分:0)
这不像其他方法那么短,但是我认为它更清晰,并且 可以轻松扩展以涵盖其他用例:
$f = function ($s1, $s2) {
$n = strlen($s1) <=> strlen($s2);
if ($n != 0) {
return $n;
}
return $s1 <=> $s2;
};
usort($array, $f);