繁体   English   中英

按长度排序数组,然后按字母顺序

[英]sort array by length and then alphabetically

我正在尝试首先按长度对单词进行排序,然后按字母顺序排序。

// from
$array = ["dog", "cat", "mouse", "elephant", "apple"];

// to
$array = ["cat", "dog", "apple", "mouse", "elephant"];

我已经看到了这个答案,但它是在 Java 中,而这个答案,但它只处理按长度排序。 我试过按长度排序,使用答案中提供的代码,然后按字母顺序排序,但它只按字母顺序排序。

如何先按长度排序,然后按字母顺序排序?

您可以将这两个条件放入一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM