【问题标题】:Sorting multi-dimensional arrays by element size按元素大小对多维数组进行排序
【发布时间】:2010-10-28 06:22:31
【问题描述】:

我希望能够按元素数组的大小对该数组进行排序;

array( 
    [0] =>  array( [0] => 'B',  [1] => 'C');
    [1] =>  array( [0] => 'B');
    [2] =>  array( [0] => 'A', [1] =>  'C');
    [3] =>  array( [0] => 'A', [1] =>  'B', [2] =>  'C');
    [4] =>  array( [0] => 'C');       
    [5] =>  array( [0] => 'A');
    [6] =>  array( [0] => 'A', [1] =>  'B');
   )

array( 
    [0] =>  array( [0] => 'A');
    [1] =>  array( [0] => 'B');
    [2] =>  array( [0] => 'C');
    [3] =>  array( [0] => 'A', [1] =>  'B');
    [4] =>  array( [0] => 'A', [1] =>  'C');
    [5] =>  array( [0] => 'B',  [1] => 'C');
    [6] =>  array( [0] => 'A', [1] =>  'B', [2] =>  'C');
)

【问题讨论】:

  • 您在寻找优雅还是“足够好”?

标签: php arrays sorting multidimensional-array


【解决方案1】:

使用闭包(PHP 5.3):

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

不使用闭包(PHP 5.2):

usort($array, create_function('$a, $b', 'return count($a) - count($b)'));

请注意,$array 将就地排序。不要在usort()的返回值里找。

【讨论】:

    【解决方案2】:

    我没有测试过这个,但我希望你能明白这一点。

    function yoursort($a,$b) {
      if(!(is_array($a) && is_array($b)) return 0; // item of array is not an array
      $cntA = sizeof($a);
      $cntB = sizeof($b);
      if($cntA!=$cntB) return $cntA-$cntB; // smaller array up
      foreach($a as $key=>$val) {
        $ordA = ord($a[$key]);
        $ordB = ord($b[$key]);
        if($ordA!=$ordB) return $ordA-$ordB; // sort sub array by alphabet
      }
      return 0; // items are equal
    }
    usort($yourarray,"yoursourt");
    

    在这里您可以找到有关 usort 的更多信息 http://php.net/manual/en/function.usort.php

    【讨论】:

      【解决方案3】:

      您可以分两步完成。

      • 在步骤 1 中,对单个数组进行排序 价值。
      • 在第 2 步中,对二维数组进行排序,首先 基于大小,如果大小不是 对值进行相等排序。

      代码:

      foreach($input as $key => $val) {
              sort($input[$key]);
      }
      usort($input, "cmp");
      print_r($input);
      
      function cmp($a,$b) {
              if(count($a) != count($b)) {
                      return count($a) - count($b);
              }
              for($i=0;$i<count($a);$i++) {
                      if($a[$i] != $b[$i]) {
                              return strcmp($a[$i],$b[$i]);
                      }
              }
              return 0;
      }
      

      Code in Action

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-16
        • 2021-12-06
        • 2016-05-29
        • 1970-01-01
        • 2011-02-24
        • 2011-03-15
        • 1970-01-01
        相关资源
        最近更新 更多