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;
}
});
实际上(根据我的经验),这是按照多个条件对无序的多维数组进行排序。您可以像上面那样使用usort
。
这种方法不像其他方法那么简短,但我认为它更清晰,并且可以轻松扩展以涵盖其他用例:
$f = function ($s1, $s2) {
$n = strlen($s1) <=> strlen($s2);
if ($n != 0) {
return $n;
}
return $s1 <=> $s2;
};
usort($array, $f);