【问题标题】:validate power of 2 numbers in Laravel在 Laravel 中验证 2 个数字的幂
【发布时间】:2019-02-10 07:51:51
【问题描述】:

我如何验证 1 到 1000 之间的数字,它们是 2 的幂?

public function rules()
{
  return [
   'threshold' => 'required'|between:1,1000|power??
  ];
}

【问题讨论】:

  • 请不要编辑问题的答案。请改用答案部分

标签: php validation laravel-5 between


【解决方案1】:

您可以在验证中使用闭包:

public function rules()
    {
        return [
            'threshold' => [
                'required',
                'between:1,1000',
                function ($attribute, $value, $fail) {
                    if ($value == 0 || ($value & ($value - 1)) != 0) {
                        $fail($attribute . ' is not power of 2!');
                    }
                },
            ]
        ];
    }

查看 laravel 文档 => Validation

【讨论】:

  • 感谢您的回复。我很好奇 ($value & ($value - 1)) != 0 它是如何工作的?!
  • 如果您考虑二进制模式中的数字(1 和 0),则作为 2 的幂的数字将是这样的(2=>10 , 4=>100, 8=>1000, 16 =>10000 ...) 和这些数字之前的数字将类似于 (1=>01, 3=>011, 7=>0111, 15=>01111)... 所以如果你对这个数字(例如 100 和 011(4 和 3))答案将是 0,所以......就像所说的,如果只有给定值和 value-1 的结果等于 0,则条件将为真;
  • 如果您介意在此处发送您的答案,请。 stackoverflow.com/questions/54743262/…
  • 感谢您的回答。这非常有用。
【解决方案2】:

您可以为此创建一个新的Rule object

例如:

class PowerOfTwo implements Illuminate\Contracts\Validation\Rule
{
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return ($value & ($value - 1)) == 0;
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The :attribute must be a power of 2.';
    }
}

要使用上述规则,您可以这样做:

$data = [
    'threshold' => 256  
];

$rules = [
    'threshold' => ['required', 'integer', 'between:1,1000', new PowerOfTwo]
];

$validator = Validator::make($data, $rules);     

如果您想测试您的数字是否在 1 到 1000 之间,还需要添加 integer 规则。

这是您可以玩的example

【讨论】:

  • 您的条件将在已磨损的zero 上返回 true!
猜你喜欢
  • 2022-08-19
  • 2020-04-29
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2020-09-02
  • 2020-04-18
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多