【问题标题】:Sorting an array of arrays by the child array's length?按子数组的长度对数组数组进行排序?
【发布时间】:2010-10-02 20:30:53
【问题描述】:

PHP 中根据数组长度对数组进行排序的最佳方法是什么?

例如

$parent[0] = array(0, 0, 0);
$parent[2] = array("foo", "bar", "b", "a", "z");
$parent[1] = array(4, 2);

$sorted = sort_by_length($parent)

$sorted[0] = array(4, 2);
$sorted[1] = array(0, 0, 0);
$sorted[2] = array("foo", "bar", "b", "a", "z");

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    试试usort函数:

    function sortByLength( $arr1, $arr2 )
    {
        $c1 = count($arr1);
        $c2 = count($arr2);
    
        return $c1 < $c2 ? -1 : $c1 == $c2 ? 0 : 1;
    }
    
    usort($initial_array,'sortByLength');
    

    编辑以尊重参数引用;无论如何,这与@david 的答案相同

    【讨论】:

      【解决方案2】:

      我赞成彼得,但我认为这是另一种方式:

      function cmp($a1, $a2) {
          if (count($a1) == count($a2)) {
              return 0;
          }
          return (count($a1) < count($a2)) ? -1 : 1;
      }
      
      usort($array, "cmp");
      

      【讨论】:

      • 这有效,但没有维护密钥。感谢您的回答。
      • 我能够通过使用 uasort 而不是 usort 来保留密钥。
      【解决方案3】:

      这将起作用:

      function sort_by_length($arrays) {
          $lengths = array_map('count', $arrays);
          asort($lengths);
          $return = array();
          foreach(array_keys($lengths) as $k)
              $return[$k] = $arrays[$k];
          return $return;
      }
      

      请注意,此函数将保留数字键。如果您想重置密钥,请将其封装在对 array_values() 的调用中。

      【讨论】:

        【解决方案4】:

        如果只使用长度作为数组键,然后进行 ksort 呢?例如:

        function sort_by_length($parent) { 
          foreach($parent as $child) {
           $sorted[count($child)] = $child;
          }
          return ksort($sorted);
        }
        

        【讨论】:

        • 因为 ksort() 返回 TRUE 或 FALSE。以下会更好:function sort_by_length($parent) { foreach($parent as $child) { $sorted[count($child)] = $child; } ksort($sorted); return array_values($sorted); }
        猜你喜欢
        • 2021-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-20
        • 2019-11-14
        • 2013-08-18
        • 1970-01-01
        相关资源
        最近更新 更多