2017-09-04 121 views
1

我有这个数组[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

+1

是的,可以。如何定义范围?他们可以改变吗?你期望的结果是什么?你想数数还是组?这个问题有点含糊。 – salathe

+0

嘿@salathe,对不起我的英语不好,我有'用户'表中的数据库与列'birth_date'。 是的,我想分组年龄为 {10-20岁,21-30岁,等等}, 的用户,然后统计具有特定年龄段的用户总数。我想创建一个像这样的HTML表格 Age |总用户数 10至20 | 20 21至30 | 58 –

回答

0

你需要什么,我相信是:

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] 
0

用您范围的新数组,然后通过价值观,并通过内部的范围迭代。如果当前值的范围内,记录添加到当前范围:

<?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

0

我觉得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]