项目需求
- 求不同产品名称价格的最大值、最小值、平均值和中位数;
代码分解
最大值、最小值、平均值
在mysql中直接调用min()、max()、avg()函数,使用按产品名称分组统计即可实现;但是中位数,需要自己二次封装自定义函数
$sql = "select cat_name,MIN(pro_price) AS lowest,MAX(pro_price) AS highest,AVG(pro_price) AS average FROM " . $db->table('product') . " WHERE 1";
中位数封装函数
中位数概念
中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。
实现思路
1.使用sort() 对数组进行排序,再使用count()求数组长度;
2.判断数组长度是偶数还是奇数;
3.如果数组长度是偶数,那么中位数将为(数组名[(长度)/2]+数组名[((长度)/2)+1])/2;
4.如果数组长度为奇数,则中位数将是中间元素[(长度/2)-0.5
封装函数
//求中位数 function median($Arr) { sort($Arr, 1); $totalNumbers = count($Arr); $mid = floor($totalNumbers / 2); return ($totalNumbers % 2) === 0 ? Round(($Arr[$mid - 1] + $Arr[$mid]), 2) / 2 : $Arr[$mid]; }
调用中位数函数
//求中位数; foreach ($row as $k => $v) { $sql_l = "select pro_price from " . $db->table('product'); $sql_l .= " WHERE cat_name = '" . $v['cat_name'] . "'"; $row_l = $db->queryall($sql_l); //循环数组; $data = array(); for ($i = 0; $i < count($row_l); $i++) { $data[] = $row_l[$i]['pro_price']; } //求中位数; $row[$k]["medium"] = median($data); }
导出函数库&搜索条件
require 'libs/price.export.php'; $cat_name = $_POST['cat_name']; $fromTime = $_POST['fromTime']; $toTime = $_POST['toTime'];
完整代码
//导出日志; case "exp"; require 'libs/price.export.php'; $cat_name = $_POST['cat_name']; $fromTime = $_POST['fromTime']; $toTime = $_POST['toTime']; $sql = "select cat_name,MIN(pro_price) AS lowest,MAX(pro_price) AS highest,AVG(pro_price) AS average FROM " . $db->table('product') . " WHERE 1"; if ($cat_name != "") { $sql .= " AND cat_name = '" . $cat_name . "'"; } if ($fromTime != "") { $sql .= " AND DATE_FORMAT(FROM_UNIXTIME(pro_month),'%Y-%m-%d') >= '" . $fromTime . "'"; } if ($toTime != "") { $sql .= " AND DATE_FORMAT(FROM_UNIXTIME(pro_month),'%Y-%m-%d') <= '" . $toTime . "'"; } $sql .= " GROUP BY cat_name"; $row = $db->queryall($sql); //求中位数; foreach ($row as $k => $v) { $sql_l = "select pro_price from " . $db->table('product'); $sql_l .= " WHERE cat_name = '" . $v['cat_name'] . "'"; $row_l = $db->queryall($sql_l); //循环数组; $data = array(); for ($i = 0; $i < count($row_l); $i++) { $data[] = $row_l[$i]['pro_price']; } //求中位数; $row[$k]["medium"] = median($data); } //导出; $infoName = "Price Analysis" . date("Y.m.d"); expExcel($row, $infoName); break;
@漏刻有时