【问题标题】:Group Array By Range Value按范围值分组数组
【发布时间】:2017-09-04 18:17:19
【问题描述】:

我有这个数组[1,1,2,2,2,3,4,4,5,6,6,6,7],我可以根据范围值对数组进行分组,所以得到最终的结果:

'1-3' = [1,1,2,2,2,3]; // Count is 6 '4-5' = [4,4,5]; // Count is 3 '6-7' = [6,6,6,7]; // Count is 4

【问题讨论】:

  • 是的,你可以。范围是如何定义的?他们能改变吗?你期望结果是什么?你要数数还是分组?这个问题有点含糊。
  • 嘿@salathe,抱歉我的英语不好,我在数据库中有'User'表,列'birth_date'。是的,我想对年龄为 {10-20 岁、21-30 岁等} 的用户进行分组,然后计算具有特定年龄范围的用户总数。我想创建一个像这样的 HTML 表格 Age |总用户 10 到 20 | 20 21 至 30 | 58

标签: php arrays laravel-5


【解决方案1】:

我相信你需要的是:

function array_get_range($array, $min, $max) {
    return array_filter($array, function($element) use ($min, $max) {
       return $element >= $min && $element <= $max; 
    });
}

$array = [1,1,2,2,2,3,4,4,5,6,6,6,7];

$range13 = array_get_range($array, 1, 3); // [1, 1, 2, 2, 2, 3]
$range45 = array_get_range($array, 4, 5); // [4, 4, 5]
$range67 = array_get_range($array, 6, 7); // [6, 6, 6, 7]

【讨论】:

    【解决方案2】:

    使用您的范围创建一个新数组,然后遍历值和内部范围。如果当前值在范围内,则将记录添加到当前范围:

    <?php
    $numbers = [1,1,2,2,2,3,4,4,5,6,6,6,7];
    $counts = [];
    $counts[] = ["values"=> [1, 3], "records" => []]; // first value in "values" is min, second is max
    $counts[] = ["values"=> [4, 5], "records" => []];
    $counts[] = ["values"=> [6, 7], "records" => []];
    foreach ($numbers as $number) {
        foreach ($counts as $key => &$value) {
            if ($number >= $value["values"][0] && $number <= $value["values"][1]) { // if between the range, add it to the records
                $value["records"][] = $number;
            }
        }
    }
    echo "<pre>";
    foreach ($counts as $count) {
        echo $count["values"][0]." - ".$count["values"][1]." = ".count($count["records"])." elements<br>";
    }
    

    Demo

    【讨论】:

      【解决方案3】:

      我认为array_intersect()range()sizeof()/count() 为这项任务做了更清洁的工作。它消除了双重条件。

      代码:(Demo)

      function count_range($array, $min, $max) {
          return sizeof(array_intersect($array, range($min, $max)));
      }
      
      $array = [1, 1, 2, 2, 2, 3, 4, 4, 5, 6, 6, 6, 7];
      
      echo count_range($array, 1, 3);  // 6 from [1, 1, 2, 2, 2, 3]
      echo count_range($array, 4, 4);  // 2 from [4, 4]
      echo count_range($array, 2, 7);  // 11 from [2, 2, 2, 3, 4, 4, 5, 6, 6, 6, 7]
      
      • range() 创建一个包含一个或多个连续整数的白名单数组。
      • array_intersect() 一次性比较输入数组和白名单数组。
      • sizeof() 只是 count() 的别名,用于确定保留了多少元素。

      【讨论】:

        猜你喜欢
        • 2013-04-27
        • 2021-05-06
        • 1970-01-01
        • 1970-01-01
        • 2021-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多