【问题标题】:Sort a multi-dimensional array by the size of its sub-arrays按子数组的大小对多维数组进行排序
【发布时间】:2012-03-16 08:47:27
【问题描述】:

我有这个多维数组:

Array
(
    [0] => Array
        (
        [0] => 2012-02-26 07:15:00
        )
    [1] => Array
        (
            [0] => 2012-02-26 17:45:00
            [1] => 2012-02-26 18:55:00
        )
    [2] => Array
        (
            [0] => 2012-02-26 18:55:00
            [1] => 2012-02-26 17:45:00
        )
    [3] => Array
        (
            [0] => 2012-02-26 18:57:00
            [1] => 2012-02-26 17:45:00
            [2] => 2012-02-26 18:55:00
        )

当我计算子数组时,我得到了 1,2,2,3。我怎么能在 3,2,2,1 中收到它?例如,我需要获取具有最高子数组计数的最后 3 个子数组(DESC,这意味着 3、2、2)。我怎样才能做到这一点?

【问题讨论】:

  • 相关部分有很多重复项 -->

标签: php sorting multidimensional-array sub-array


【解决方案1】:

你可以通过usort函数来实现。

function cmp($a, $b){
    return (count($b) - count($a));
}
usort($array, 'cmp');
$highest_3_sub_arrays = array_slice($array, 0, 3);

【讨论】:

    【解决方案2】:

    这可能就是你想要的:

    natsort($sub_count);
    $rev = array_reverse($sub_count);
    $result = array_pad($rev, 3);
    

    如果您的值已经按顺序排列,您可能希望省略实际排序。

    【讨论】:

      【解决方案3】:
      $sizes=array();
      foreach ($myarray as $k=>$v) 
        if (!is_array($v)) $sizes["$k"]=0;
        else $sizes["$k"]=sizeof($v);
      
      sort($sizes);
      
      
      echo array_pop($sizes); //outputs 3
      echo array_pop($sizes); //outputs 2
      echo array_pop($sizes); //outputs 2
      

      【讨论】:

      • 谢谢,它也可以。只需将 echo 重命名为: print_r(array_pop($sizes)); //输出 3 print_r(array_pop($sizes)); //输出 2 print_r(array_pop($sizes)); //输出2
      【解决方案4】:

      在我看来,所有其他答案都太努力了。 usort()count()foreach() 不是必需的,当我尝试 natsort() 时,它给了我:<b>Notice</b>: Array to string conversion in <b>[...][...]</b>

      rsort() 将把最长的子数组放在第一位。

      代码:

      $array=array(
          ["2012-02-26 18:55:00","2012-02-26 17:45:00"],
          ["2012-02-26 07:15:00"],
          ["2012-02-26 18:57:00","2012-02-26 17:45:00","2012-02-26 18:55:00"],
          ["2012-02-26 17:45:00","2012-02-26 18:55:00"]
      );
      
      $size=3; // modify this line to declare how many subarrays to capture
      rsort($array); // sort the subarrays in DESC order
      var_export(array_slice($array,0,$size));  // print the first n subarrays
      

      输出:

      array (
        0 => 
        array (
          0 => '2012-02-26 18:57:00',
          1 => '2012-02-26 17:45:00',
          2 => '2012-02-26 18:55:00',
        ),
        1 => 
        array (
          0 => '2012-02-26 18:55:00',
          1 => '2012-02-26 17:45:00',
        ),
        2 => 
        array (
          0 => '2012-02-26 17:45:00',
          1 => '2012-02-26 18:55:00',
        ),
      )
      

      如果你想实现一些额外的排序来打破长度关系(比如在你的两个 2 元素子数组之间),那么你需要在你的问题中指定它。

      【讨论】:

      • @peter 我正在重新审视我的旧答案,看看我是否可以改进它们。据我所知,没有比我发布的更好的方法了。您认为我的回答是一种解决方案吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多