两种用户年龄段统计的方法

原创
2017/11/24 12:07
阅读数 767

第一种方法:

  • 优点: 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;
      }
    

个人喜好简洁的代码,虽然第一种方法没有第二种方法的代码易读,但是代码量少了很多;

但是最终测试的结果,第二种方式在效率上更好,觉得选第二种好。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部