推荐链接:blog.sina.com.cn/s/blog_6925c03c0102w3ow.html
这位老哥写的计算公式和原理个人觉得不错,愿意了解的可以去看看!
代码:
/*
* 计算空气AQI值
* params() 和 getDatas()是自己封装的获取传值以及处理返回值的方法
*/
function calculateAQI(){
//获取传值
$PM10 = params('PM10');
$PM25 = params('PM25');
$CO = params('CO');
$SO2 = params('SO2');
$NO2 = params('NO2');
$O3 = params('O3');
//参数区间
// $PM10_arr = [0,50,150,250,350,420,600];
// $PM25_arr = [0,35,75,115,150,250,500];
// $CO_arr = [0,5,10,35,60,90,150];
// $SO2_arr = [0,150,500,650,800];
// $NO2_arr = [0,100,200,700,1200,2340,3840];
// $O3_arr = [0,160,200,300,400,800,1200];
$PM10_arr = [0,50,150,250,350,420,500,600];
$PM25_arr = [0,35,75,115,150,250,350,500];
$CO_arr = [0,2,4,14,24,36,48,60];
$SO2_arr = [0,150,500,650,800];
$NO2_arr = [0,50,150,475,800,1600,2100,2620];
$O3_arr = [0,100,160,215,265,800];
//获取每个指数的AQI
$arr = array();
$arr['PM10'] = self::interval($PM10_arr,$PM10,8);
$arr['PM25'] = self::interval($PM25_arr,$PM25,8);
$arr['CO'] = self::interval($CO_arr,$CO,8);
$arr['SO2'] = self::interval($SO2_arr,$SO2,5);
$arr['NO2'] = self::interval($NO2_arr,$NO2,8);
$arr['O3'] = self::interval($O3_arr,$O3,6);
//结果排序
$AQI = max($arr);
//包装、处理返回值
return getDates($AQI);
}
//获取指数所处区间
function interval($arr,$val,$max){
$IAQI_arr = [0,50,100,150,200,300,400,500];//空气质量分指数
$result = 0;
for($i=0;$i<$max;$i++){
if($i<$max-1){
if($arr[$i]<$val && $val<=$arr[$i+1]){
$ihigh = $IAQI_arr[$i+1];
$ilow = $IAQI_arr[$i];
$high = $arr[$i+1];
$low = $arr[$i];
$result = self::calculate($ihigh,$ilow,$high,$low,$val);
}
}
}
return $result;
}
function calculate($ihigh,$ilow,$high,$low,$value){
$AQI = ($ihigh - $ilow) * ($value - $low) / ($high - $low) + $ilow;
return round($AQI);
}