第一种方法:
-
优点: 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; }
个人喜好简洁的代码,虽然第一种方法没有第二种方法的代码易读,但是代码量少了很多;
但是最终测试的结果,第二种方式在效率上更好,觉得选第二种好。