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

时间:2017-06-29 22:15:42

标签: php sorting

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

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

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

我见过this answer,但它是Java,this answer,但它只处理按长度排序。我尝试使用答案中提供的代码按长度排序,然后按字母顺序排序,但之后按字母顺序排序。

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

3 个答案:

答案 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);