【问题标题】:Group by age array returns empty按年龄数组分组返回空
【发布时间】:2019-01-02 10:33:12
【问题描述】:

我正在尝试计算用户年龄,然后将这些结果分组如下:

public function setAge($users)
{
    if($users)
        foreach($users as $user)
        {
            $now    = Carbon::now();
            $u->age = Carbon::createFromFormat('Y-m-d', $u->birth_date);
            $u->age = $now->diffInYears($u->age)
        }

    return $users;
}

public function groupByAge($users)
{
    $ageGroups = ['less than 20', 'more than 20'];
    foreach ($users as $u) 
       switch($u->age) {
           case ($u->age < 20)
               $ageGroups['less than 20'] += 1;
               break;
           case($u->age > 20)
               $ageGroups['more than 20'] += 1;
               break;
       }

    return $age;
}           

public function index()
{
    $users = DB::table('users')->get;
    $users = $this->setAge($users);
    $users = $this->groupByAge($users);

    dd($groupByAge);

    return view('/users/',['users'=> $users]);
}

但是当我dd($groupByAge) 时,我总是收到

空数组,例如 ('key' => 0)

我不确定我是否没有正确传递$users 或者发出了什么。

【问题讨论】:

  • $groupByAge 不是您要 dd 的变量。而是 dd $users 变量
  • 如果$u-&gt;age == 20怎么办?
  • endforeachendif 在 PHP 上下文中是什么意思? $u 是什么?您使用它u-&gt;birth_date(顺便说一句。缺少 $ 符号)之前没有声明它。请提供一个没有语法错误的代码示例。
  • 检查您的groupByAge 函数,它返回从未设置的$age。那foreach 没有在任何地方关闭?此外,$ageGroup['less then 20']$ageGroup['less than 20'] 不同。
  • @commonsense endifendforeachalternative syntaxes。也不知道.. 但是 : 缺少语法

标签: php laravel


【解决方案1】:
/**
 * @return array()
 */
public function setAge($users) {
  if($users) {
    foreach($users as &$user) {
      $now = Carbon::now();
      $user->age = Carbon::createFromFormat('Y-m-d', $user->birth_date);
      $user->age = $now->diffInYears($user->age);
    }
  }
 return $users;
}

/**
 * @return array()
 */
public function groupByAge($users) {
   $ageGroups = ['less than 20', 'more than 20'];
   $ageGroup = [];
    foreach ($users as $u) { 
        switch($u->age) {
          case ($u->age < 20) :
             $ageGroup['less_then_20'] = 1;
          break;
         case($u->age >= 20) :
             $ageGroup['more_than_20'] = 1;
         break;
         default:
             $ageGroup['error'] = 'error';
         break;
     }
   }
   return $ageGroup;
 }           

  public function index() {
    $users = DB::table('users')->get;
    $users = $this->setAge($users);
    $users = $this->groupByAge($users);

    print_r("<pre>");
    print_r($users);
    print_r("</pre>");die();

    return view('/users/',['users'=> $users]);
 }

【讨论】:

  • 你看groupByAge($users)这个方法数组变量`$ageGroups`没有在switch case数组变量中使用。并且在这段代码中解决了太多错误。
  • 为什么把+1改成1$ageGroup[A_KEY] =,即使相关年龄组的人超过1人,结果也只有1人
【解决方案2】:

Carbon 提供了一种直接计算年龄的方法。因此,假设 $birth_date 已经被转换为 Carbon 实例,则可以调用 age

我不确定您是否只想计算特定年龄段的用户,或者您是否想对他们进行分组。如标题所示,将用户分组为年龄组,您可以执行以下操作:

public function index() {
    $groupedUsers = User::all()->mapToGroups(function($user, $key) {
        if ($user->birth_date->age < 20) {
            $ageGroups['less than 20'][] = $user
        } else {
            $ageGroups['more than 20'][] = $user
        }

        return $ageGroups;
    });


    return view('/users/',[
    'users'=> $groupedUsers
    ]);
 }

【讨论】:

  • 我认为继续使用 Carbon 这两个功能是最好的答案
【解决方案3】:

你应该试试这个:

public function index() {
    $users = DB::table('users')->get;
    $users = $this->setAge($users);
    $users = $this->groupByAge($users);
    dd($users); exit();
    return view('/users/',[
      'users'=> $users]);

}

【讨论】:

  • 我为什么要先 dd 然后 exit()?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 2016-11-24
  • 1970-01-01
相关资源
最近更新 更多