按长度和字母顺序对数组进行排序

4

我正在尝试制作一种按照长度和字母顺序排序单词的方法。

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

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

我看过这个答案,但它是用Java写的,而这个答案只处理按长度排序。我尝试了按长度排序,使用答案提供的代码,然后按字母顺序排序,但只按字母顺序排序。
如何先按长度排序,然后再按字母顺序排序?

你能否/想要修改数组中的值吗?如果可以,那么如何迭代每个数组值并编写一个包含每个值长度的字符串?例如:"03dog"、"03cat"、"04mouse"、"08elephant"、"05apple",然后按值排序? - SaschaP
你尝试过什么?SO不是一个“如何做这个”网站,而是一个“我的代码有什么问题”网站。展示一下你尝试过的内容,这样我们才能提供指导。同时请查看PHP文档:http://php.net/docs.php - AlienHoboken
@AlienHoboken 幸运的是,并不是每个问题都需要调试。 - Don't Panic
@Don'tPanic 这类问题是不适合讨论的,特别是当已经有很多关于如何按字母顺序排序PHP数组的问题存在时。https://stackoverflow.com/search?q=php+sort+array+alphabetically - AlienHoboken
1
@AlienHoboken,我想做的不仅仅是按字母顺序排序,如果我只想这样做,我可以使用基本排序,我不需要问。 - yaakov
3个回答

9
你可以将这两个条件都放入一个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


0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接