【问题标题】:PHP: Sort an array by the length of its values?PHP:按其值的长度对数组进行排序?
【发布时间】:2010-10-24 16:56:06
【问题描述】:

我做了一个字谜机器,我有一系列正匹配。问题是它们的顺序不同,我希望能够对数组进行排序,以便首先出现最长的数组值。

有人对如何做到这一点有任何想法吗?

【问题讨论】:

    标签: php arrays


    【解决方案1】:
    function sortByLength($a,$b){
      if($a == $b) return 0;
      return (strlen($a) > strlen($b) ? -1 : 1);
    }
    usort($array,'sortByLength');
    

    【讨论】:

    • 这里有一个错误。你的平等条件太窄了。字符串“abc”和“def”应该从这种排序中返回 0,但不会。他们将改为返回 1。虽然我意识到这不是一个严重的错误(输出不会看起来损坏,但它在技术上是不准确的。
    • 'if($a == $b) return 0;'这是个错误。我们在谈论长度。
    • @ Peter 和 Thinker,是的,这是 PHP 手册的一个奇怪之处。我自己做了 strlen($a) == strlen($b),但后来我看到,由于 PHP 使用了不稳定的排序,没关系!它仍然弄乱了顺序。所以我想出了最短的函数。
    • 从基于手册的一些示例中获得(如未知所说),并没有真正费心分析它,因为我最近不喜欢 php,只是检查它是否有效。做得更好-很好。
    • 是的,手动示例和 cmets 有时非常可悲,但我不知道这是否真的值得一试 :) Cheerz。
    【解决方案2】:

    使用http://us2.php.net/manual/en/function.usort.php

    使用这个自定义函数

    function sort($a,$b){
        return strlen($b)-strlen($a);
    }
    
    usort($array,'sort');
    

    如果您想保留旧索引,请使用 uasort,如果您不关心,请使用 usort。

    另外,我相信我的版本更好,因为 usort 是一种不稳定的排序。

    $array = array("bbbbb", "dog", "cat", "aaa", "aaaa");
    // mine
    [0] => bbbbb
    [1] => aaaa
    [2] => aaa
    [3] => cat
    [4] => dog
    
    // others
    [0] => bbbbb
    [1] => aaaa
    [2] => dog
    [3] => aaa
    [4] => cat
    

    【讨论】:

    • 这很好,虽然我不会把这个函数称为“排序”。下面的 sortByLength 更具描述性。
    • 对所有人 - 记住 mb_strlen() - 并非所有语言都是相同的
    • 不,Brian,该函数的工作不是排序,而是比较。因此,我将其称为 compareStrLengthNegatively
    • 不将其命名为“排序”很重要,不是因为描述性,而是因为致命错误:无法重新声明排序。
    • 为什么不用 mb_strlen 而不是 strlen?虽然比 strlen 慢,但一旦出现多字节值,它会防止头痛。
    【解决方案3】:

    这是我过去做过的一种方式。

    // Here's the sorting...
    $array = array_combine($words, array_map('strlen', $words));
    arsort($array);
    

    【讨论】:

    • 具有相同值的数组将被合并:array("aba", "aa", "ad", "vcd", "aba");
    【解决方案4】:

    很简单。

    function LSort(a,b){return a.length-b.length;}
    
    var YourArray=[[1,2,3,4,5,6], ['a','b'], ['X','Y','Z'], ['I','Love','You'], ['good man']];
    
    YourArray.sort(Lsort);
    

    结果:

    ['good man'] Length=1
    ['a','b'] Length=3
    ['X','Y','Z'] Length=3
    ['I','Love','You'] Length=3
    [1,2,3,4,5,6] Length=6
    

    【讨论】:

    【解决方案5】:

    如果你想用 PHP 5.3 的方式来做,你可能想创建这样的东西:

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

    这样您就不会污染您的全局命名空间。

    但仅当您需要在源代码中的一个位置使用它以保持干燥时才这样做。

    【讨论】:

      【解决方案6】:

      创建一个由 oyur 数组元素组成的 strlen 数组,并将 multisort 与您的数组一起创建。

      foreach($Yourarray as $c=>$key) {               
          $key['maxlen'] = strlen($key);  
          $sort_numcie[] = $key['maxlen'];
      }
      
      array_multisort($sort_numcie, $Yourarray);  
      

      这肯定会奏效。我确定!

      【讨论】:

        【解决方案7】:

        除了接受的答案之外,使用升序或降序按长度对数组进行排序:

        function strlen_compare($a,$b){
            if(function_exists('mb_strlen')){
                 return mb_strlen($b) - mb_strlen($a);
            }
            else{
                 return strlen($b) - strlen($a);
            }
        }
        
        function strlen_array_sort($array,$order='dsc'){
            usort($array,'strlen_compare');
            if($order=='asc'){
                $array=array_reverse($array);
            }
            return $array;
        }
        

        【讨论】:

          【解决方案8】:

          PHP7 即将到来。在 PHP7 中,您可以使用 Spaceship Operator

          usort($array, function($a, $b) {
              return strlen($b) <=> strlen($a);
          });
          

          希望这对您将来有所帮助。

          【讨论】:

          • 有趣,不知道那个。我想知道只使用减法而不是像@clttj 建议的那样对性能有什么好处。
          【解决方案9】:
          array_multisort(array_map('count', $arr), SORT_DESC, $arr);
          

          【讨论】:

            【解决方案10】:

            这是一种使用 spaceship 运算符的方法(需要 PHP 7.0):

            $arr = ['apple','pear','oranges','banana'];
            usort($arr, function ($a, $b) { return (strlen($a) <=> strlen($b)); });
            print_r($arr);
            

            【讨论】:

              【解决方案11】:

              降序:

              $array = ['aa', 'bb', 'c', 'ccc', 'a', 'ertre'];
              
              usort($array, function($a, $b){
                 return strlen($a) < strlen($b);
              });
              
              var_export($array);
              
              // Output
              array (
                0 => 'ertre',
                1 => 'ccc',
                2 => 'aa',
                3 => 'bb',
                4 => 'c',
                5 => 'a',
              )
              
              

              升序:

              $array = ['aa', 'bb', 'c', 'ccc', 'a', 'ertre'];
              
              usort($array, function($a, $b){
                 return strlen($a) > strlen($b);
              });
              
              // Output
              array (
                0 => 'c',
                1 => 'a',
                2 => 'aa',
                3 => 'bb',
                4 => 'ccc',
                5 => 'ertre',
              )
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-04-26
                • 2010-10-02
                • 1970-01-01
                • 2013-08-18
                • 1970-01-01
                • 2021-04-23
                • 1970-01-01
                相关资源
                最近更新 更多