第一种方法:
优点: 1.代码量少; 2.可以自定义年龄段;
缺点: 1.相对于第二种方法,代码不易读懂; 2.效率差一丁点,一万条数据,比第二种方法慢了0.002秒左右 private function computeData($members)
{
if (empty($members)) {
return false;
}
$currentYear = date('Y');
$static = [];
foreach ($members as $member) {
$sex = $member['sex']; // 会员性别
$level = $member['level']; // 会员等级
preg_match('/^(\d{4})-/', $member['birthday'], $matches);
if (empty($matches) || !isset($matches[1])) {
if (!isset($static['other'][$sex][$level])) {
$static['other'][$sex][$level] = 1;
continue;
}
$static['other'][$sex][$level]++;
continue;
}
$birthday = $matches[1];
$age = $currentYear - $birthday; // 计算当前会员年龄
// 此处可以设置一个参数,进行年龄段的自定义
$ages = [0, 20, 25, 30, 35, 40, 45]; // 列出统计的年龄段
$ages[] = $age; // 将当前会员的年龄存入年龄段数组中
sort($ages); // 排序
$key = array_search($age, $ages); // 查找当前会员年龄所处位置的索引
$index = $key - 1; // 索引 减 1,得到所属的年龄段
$index = $index > 0 ? $index : 0; // 如果是负数,则取零,作为该会员所属的年龄段
$age = $ages[$index] > 0 ? $ages[$index] : 0; // 会员所属的年龄段
// 统计该年龄段中,各个等级的会员数量
$static[$age][$sex][$level] = isset($static[$age][$sex][$level]) ? ++$static[$age][$sex][$level] : 1;
return $static;
}
第二种方法:
优点: 1.代码易懂; 2.相对于第一种方法,效率高;
缺点: 1.代码多了不少; 2.无法自定义年龄段; private function computeData($members)
{
if (empty($members)) {
return false;
}
$currentYear = date('Y');
$static = [];
foreach ($members as $member) {
$sex = $member['sex']; // 会员性别
$level = $member['level']; // 会员等级
preg_match('/^(\d{4})-/', $member['birthday'], $matches);
if (empty($matches) || !isset($matches[1])) {
if (!isset($static['other'][$sex][$level])) {
$static['other'][$sex][$level] = 1;
continue;
}
$static['other'][$sex][$level]++;
continue;
}
$birthday = $matches[1];
$age = $currentYear - $birthday; // 计算当前会员年龄
switch ($age){
case $age > 45 :
$static[45][$sex][$level] = isset($static[45][$sex][$level]) ? ++$static[45][$sex][$level] : 1;
break;
case $age > 40 :
$static[40][$sex][$level] = isset($static[40][$sex][$level]) ? ++$static[40][$sex][$level] : 1;
break;
case $age > 35 :
$static[35][$sex][$level] = isset($static[35][$sex][$level]) ? ++$static[35][$sex][$level] : 1;
break;
case $age > 30 :
$static[30][$sex][$level] = isset($static[30][$sex][$level]) ? ++$static[30][$sex][$level] : 1;
break;
case $age > 25 :
$static[25][$sex][$level] = isset($static[25][$sex][$level]) ? ++$static[25][$sex][$level] : 1;
break;
case $age > 20 :
$static[20][$sex][$level] = isset($static[20][$sex][$level]) ? ++$static[20][$sex][$level] : 1;
break;
default:
$static[0][$sex][$level] = isset($static[0][$sex][$level]) ? ++$static[0][$sex][$level] : 1;
}
}
return $static;
}
个人喜好简洁的代码,虽然第一种方法没有第二种方法的代码易读,但是代码量少了很多;
但是最终测试的结果,第二种方式在效率上更好,觉得选第二种好。