代码之家  ›  专栏  ›  技术社区  ›  Jesse Orange

从给定的出生日期计算年龄组

  •  0
  • Jesse Orange  · 技术社区  · 6 年前

    在一个应用程序中,我有一个如下所示的选择框:

    <select name="AgeGroup" class="form-control" id="AgeGroup">
        <option value="18-24" selected=""18-24</option>
        <option value="18-24">18-24 years</option>
        <option value="25-34">25-34 years</option>
        <option value="35-44">35-44 years</option>
        <option value="45-54">45-54 years</option>
        <option value="55-64">55-64 years</option>
        <option value="65 Plus">65 years or over</option>
        <option value="PTNA">Prefer not to answer</option>
    </select>
    

    当我收集出生日期时,我有一个简单的变量来获取用户的年龄(以年为单位),如下所示:

    /**
     * Calculate the user's age in years given their date of birth
     *
     * @return void
     */
    public function getAgeAttribute()
    {
        $this->birth_date->diff(Carbon::now())->format('Y');
    }
    

    然后我意识到我甚至不需要年龄属性来计算年龄组,所以我做了另一个访问器如下:

    /**
     * Infer the users age group given their date of birth 
     *
     * @return void
     */
    public function getAgeGroupAttribute()
    {
        $age = $this->birth_date->diff(Carbon::now())->format('Y');
    
        switch($age){
            case($age <= 24);
                return "18 - 24";
            break;
            case ($age <= 34);
                return "25 - 34";
            break;
            case ($age <= 44);
                return "35 - 44";
            break;
            case ($age <= 54);
                return "45 - 54";
            break;
            case ($age <= 64);
                return "55 - 64";
            break;
            case ($age > 64);
                return "Over 65";
            break;
            default:
                return "Unspecified age group";
        }
    }
    

    但我担心的是,如果他们没有选择提供年龄呢?因为这个表格附带了一个选项,选择不说。

    我能不能先确认一下这是不是约会 $user->age_group ?

    另外,我想第一个开关盒应该有一个or,因为你可能不到18岁。

    case($age >= 18 && $age <= 24);

    2 回复  |  直到 6 年前
        1
  •  2
  •   Jonathon    6 年前

    你可以储存 宁愿不回答 作为一个 null 他们出生日期的价值。然后,在检查用户的年龄组时,您可以检查 无效的 珍惜并回报你的 宁愿不回答

    public function getAgeGroupAttribute()
    {
        if ($this->birth_date === null) {
            return 'Unspecified';
        }
    
        $age = $this->birth_date->diff(Carbon::now())->format('Y');
    
        // ...
    }
    
        2
  •  1
  •   pr1nc3    6 年前

    也可以将值0替换为PTNA

     <option value="0">Prefer not to answer</option>
    

    把你的开关盒和箱子一起用

    case($age >= 18 && $age <= 24);

    在这种情况下,出于一致性的原因,我也会更改默认消息,但这样就可以了。

    当然,一个更可靠的方法是检查你收到的值是多少,如果它不是一个年龄,那么甚至不要把它放在开关盒中,并将它重定向到一个 else