[英]sort array by length and then alphabetically
您可以将这两个条件放入一个usort
比较函数中。
usort($array, function($a, $b) {
return strlen($a) - strlen($b) ?: strcmp($a, $b);
});
按多个条件排序的一般策略是为每个返回比较函数的适当返回类型(整数、正数、负数或零,取决于比较结果)的条件编写比较表达式,并对它们求值按照您所需的排序顺序,例如先长度,然后按字母顺序。
如果一个表达式的计算结果为零,那么就该比较而言,这两个项目是相等的,并且应该计算下一个表达式。 如果不是,则该表达式的值可以作为比较函数的值返回。
这里的另一个答案似乎暗示这个比较函数不返回大于、小于或等于零的整数。 确实如此。
注意:我没有提前发布我的答案,因为@Don't Panic 比我快。 但是,我想在他的回答中添加一些解释(希望对更多理解有用)。
usort($array, function($a, $b) {
return strlen($a) - strlen($b) ?: strcmp($a, $b);
});
好的。 函数usort从下一个自定义比较函数等待(来自文档):
如果第一个参数被认为分别小于、等于或大于第二个参数,则比较函数必须返回一个小于、等于或大于零的整数。
好的,将@Don't Panic 代码重写为该视图(根据上述条件):
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
。
这不像其他方法那么短,但我认为它更清晰,并且可以轻松扩展以涵盖其他用例:
$f = function ($s1, $s2) {
$n = strlen($s1) <=> strlen($s2);
if ($n != 0) {
return $n;
}
return $s1 <=> $s2;
};
usort($array, $f);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.