【问题标题】:sort array by length and then alphabetically按长度排序数组,然后按字母顺序
【发布时间】:2017-06-29 22:15:41
【问题描述】:

我正在尝试一种方法,先按长度排序单词,然后按字母顺序。

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

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

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

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

【问题讨论】:

  • 你/你想修改数组中的值吗?如果是,如何遍历数组的每个值并在每个值之前写入一个包含值长度的字符串?比如"03dog", "03cat", "04mouse", "08elephant", "05apple" 然后按值排序?
  • 你试过什么? SO 不是“如何做到这一点”网站,它是“我的代码无法使用什么”网站。向我们展示您的尝试,以便我们提供指导。并查看 php 文档:php.net/docs.php
  • @AlienHoboken 幸运的是,并非每个问题都必须是调试问题。
  • @Don'tPanic 这类问题离题了,尤其是当已经存在很多关于如何在 PHP 中对数组进行排序的问题时stackoverflow.com/search?q=php+sort+array+alphabetically
  • @AlienHoboken,我想做的不仅仅是按字母顺序排序,如果我想这样做,我可以使用基本排序,我不需要问。

标签: php sorting


【解决方案1】:

您可以将这两个条件放入usort 比较函数中。

usort($array, function($a, $b) {
    return strlen($a) - strlen($b) ?: strcmp($a, $b);
});

按多个条件排序的一般策略是为每个条件编写比较表达式,返回比较函数的适当返回类型(整数、正数、负数或零,具体取决于比较结果),并按照您想要的排序顺序评估它们,例如第一个长度,然后是字母。

如果一个表达式的计算结果为零,那么就该比较而言,这两项是相等的,并且应该计算下一个表达式。如果不是,则可以将该表达式的值作为比较函数的值返回。


这里的另一个答案似乎暗示此比较函数不返回大于、小于或等于零的整数。确实如此。

【讨论】:

    【解决方案2】:

    注意:我没有提前发布答案,因为@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

    【讨论】:

      【解决方案3】:

      这不像其他方法那么短,但我认为它更清晰,并且可以轻松扩展以涵盖其他用例:

      $f = function ($s1, $s2) {
         $n = strlen($s1) <=> strlen($s2);
         if ($n != 0) {
            return $n;
         }
         return $s1 <=> $s2;
      };
      usort($array, $f);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-17
        • 2011-03-25
        • 2018-11-02
        • 1970-01-01
        • 2018-03-11
        • 2013-09-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多