PHP-计算特定范围内的数组元素

时间:2019-05-07 00:26:54

标签: php

我有一个包含950个元素的数组。元素的值在80-110之间。我想计算80-90、90-100和100-110之间的数量。然后,我将它们显示在图表上。这有可能计算php中的类似元素吗?

4 个答案:

答案 0 :(得分:2)

您可以简单地通过运行for循环来做到这一点。创建一个包含一系列元素的数组,然后运行for循环。虽然您将在该时间运行循环,但是请根据给定的三组对数组元素进行计数。最后,您将获得给定范围内的元素总数。为了给您更好的帮助,我在下面举一个例子:

<?php
    $number = array(80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110);
   $count1 = $count2 = $count3 = 0;
   for ($i = 0; $i < sizeof($number); $i++) {
       if($number[$i] >= 80 && $number[$i] <= 90 ) {
           $count1++;
       }
       if($number[$i] >= 90 && $number[$i] <= 100 ) {
           $count2++;
       }
       if($number[$i] >= 100 && $number[$i] <= 110 ) {
           $count3++;
       }

   }
   echo "The number between 80-90 = ".$count1."<br>";
   echo "The number between 90-100 = ".$count2."<br>";
   echo "The number between 100-110 = ".$count3."<br>";
?>

答案 1 :(得分:1)

我认为OP可能一直在寻求更多 pythonic 答案(但在PHP中)

//only valid in php 5.3 or higher

function countInRange($numbers,$lowest,$highest){
  //bounds are included, for this example
      return count(array_filter($numbers,function($number) use ($lowest,$highest){
    return ($lowest<=$number && $number <=$highest); 
    }));
}

$numbers = [1,1,1,1,2,3,-5,-8,-9,10,11,12];

echo countInRange($numbers,1,3); // echoes 6
echo countInRange($numbers,-7,3); // echoes 7
echo countInRange($numbers,19,20); //echoes 0

'use'关键字表示php中的'closure'。出于对其他语言(例如javascript)的理所当然的考虑,外部函数中的变量会自动在范围内(即没有特殊关键字)导入到内部函数中,内部函数也可以称为“部分函数”。

由于某些原因,在PHP 5.2x或更低版本中,变量不会自动在作用域范围内导入,而在PHP 5.3或更高版本中,use关键字可以克服这一问题。语法非常简单:

$functionHandle = function(<arguments>) use (<scope-imported variables>){
    //...your code here...
}

答案 2 :(得分:1)

在确定号码所属位置后,为避免过多的比较跳转到下一个循环。

function countOccurences( array $numbersArray ):array
{
  $return = array('n80to90' => 0, 'n90to100' => 0, 'n100to110' => 0);
  foreach( $numbersArray as $number ){
    if( $number < 80 || $number > 110 )
      continue;
    if($number < 91){
      $return['n80to90']++;
      continue;
    }
    if($number < 101){
      $return['n90to100']++;
      continue;
    }
    $return['n100to110']++;
  } 
  return  $return;
}

答案 3 :(得分:0)

我无法想象您希望将代表两组价值的统计图形归为两组。因此,我将提供一种无条件的无功能技术,该技术可以在foreach循环中执行。

代码:(Demo

$sampleData = range(80, 110);
$result = array_fill_keys(['80s', '90s', '100s'], 0);  // set 0 defaults for incrementation
foreach ($sampleData as $value) {
    ++$result[(10 * ((int)($value / 10) <=> 9) + 90) . 's'];
}
var_export($result);

输出:

array (
  '80s' => 10,
  '90s' => 10,
  '100s' => 11,
)

我的技术通过以下方法从值中制造出适当的键:

  1. 除以10
  2. 截断小数点(与floor()相同的作用
  3. 通过飞船运算符进行三向比较(返回-101
  4. 将“ -1 | 0 | 1”乘以10
  5. 添加90
  6. 最后连接一个“ s”。

++意味着用相应的键将1加到元素的当前值。


或者,如果要将值分组为“ 90+以下”(80-90),“ 100+以下”(91-100)和“ 110+以下”(101-110),则为调整密钥生成因子很简单。

我将展示分配给每个组的元素,而不是进行计数。

代码:(Demo

$sampleData = range(80, 110);
foreach ($sampleData as $value) {
    $result[(10 * ((int)(($value - 1) / 10) <=> 9) + 100) . '+under'][] = $value;
}
var_export($result);

输出:

array (
  '90+under' => 
  array (
    0 => 80,
    1 => 81,
    2 => 82,
    3 => 83,
    4 => 84,
    5 => 85,
    6 => 86,
    7 => 87,
    8 => 88,
    9 => 89,
    10 => 90,
  ),
  '100+under' => 
  array (
    0 => 91,
    1 => 92,
    2 => 93,
    3 => 94,
    4 => 95,
    5 => 96,
    6 => 97,
    7 => 98,
    8 => 99,
    9 => 100,
  ),
  '110+under' => 
  array (
    0 => 101,
    1 => 102,
    2 => 103,
    3 => 104,
    4 => 105,
    5 => 106,
    6 => 107,
    7 => 108,
    8 => 109,
    9 => 110,
  ),
)