【问题标题】:How do I validate an array of integers in Laravel如何在 Laravel 中验证整数数组
【发布时间】:2014-08-26 15:49:40
【问题描述】:

我有一个像 $someVar = array(1,2,3,4,5) 这样的整数数组。我需要验证$someVar 以确保每个元素都是数字。我该怎么做?

我知道对于单值变量的情况,验证规则类似于$rules = array('someVar'=>'required|numeric')。如何将相同的规则应用于数组$someVar 的每个元素?

非常感谢您的帮助。

【问题讨论】:

    标签: php arrays validation laravel laravel-4


    【解决方案1】:

    现在 laravel 可以选择在数组元素上设置条件。无需为验证 int 数组等简单的事情编写自己的验证器。使用这个(如果在控制器中使用)-

    $validator = \Validator::make(compact('someVar'), [
        'someVar' => 'required|array',
        'someVar.*' => 'integer'
    ]);
    $this->validateWith($validator);
    

    $this->validate($request, [
        'someVar' => 'array',
        'someVar.*' => 'int'
    ]);
    

    【讨论】:

    • 这是Laravel 5的最简单和最新的答案
    • Laravel 文档明确说明了整数验证规则 ... '此验证规则不验证输入是否为“整数”变量类型,仅验证输入是字符串或数值包含一个整数。'
    【解决方案2】:
    Validator::extend('numericarray', function($attribute, $value, $parameters)
    {
        foreach($value as $v) {
             if(!is_int($v)) return false;
        }
        return true;
    });
    

    使用它

    $rules = array('someVar'=>'required|array|numericarray')
    

    编辑: 此验证的最新版本不需要定义numericarray 方法。

    $rules = [
        'someVar'   => 'required|array',
        'someVar.*' => 'integer',
    ];
    

    【讨论】:

    • is_array 也应该在那里
    • @deczo 是对的,关于使用 is_array。所以,我修改了@Issam Zoli 的代码如下:Validator::extend('numericarray', function($attribute, $value, $parameters) { if(is_array($value)) { foreach($value as $v) { if(!is_int($v)) return false; } return true; } return is_int($value); }); 谢谢大家。
    • 你应该使用is_numeric 而不是is_int 可能
    • 在问题的范围内,如果您有混合类型,请使用 is_numeric。
    • use Illuminate\Support\Facades\Validator;
    【解决方案3】:

    在 Laravel 5 中,您可以使用 .* 检查数组中的元素。对你来说,这意味着:

    $rules = array('someVar'   => 'required|array',
                   'someVar.*' => 'integer')
    

    【讨论】:

      【解决方案4】:

      从添加新的验证属性开始

      Validator::extend('numeric_array', function($attribute, $values, $parameters)
      {
          if(! is_array($values)) {
              return false;
          }
      
          foreach($values as $v) {
              if(! is_numeric($v)) {
                  return false;
              }
          }
      
          return true;
      });
      

      如果属性不是数组或一个值不是数值,该函数将返回 false。然后将消息添加到 `app/lang/en/validation.php'

      "numeric_array"        => "The :attribute field should be an array of numeric values",
      

      【讨论】:

        【解决方案5】:

        可以为数组的整数类型值检查添加自定义规则

        打开文件

        /resources/lang/en/validation.php
        

        在文件中“已接受”消息之前添加自定义消息。

        'numericarray'         => 'The :attribute must be numeric array value.',
        "accepted"             => "The :attribute must be accepted.",
        

        现在打开文件

        /app/Providers/AppServiceProvider.php
        

        然后在启动函数中添加自定义验证。

        public function boot()
        {
        
            $this->app['validator']->extend('numericarray', function ($attribute, $value, $parameters)
            {
                foreach ($value as $v) {
                    if (!is_int($v)) {
                        return false;
                    }
                }
                return true;
            });
        
        }
        

        现在您可以使用 numericarray 对数组进行整数类型值检查

        $this->validate($request, [
                    'field_name1' => 'required',
                    'field_name2' => 'numericarray'
                ]);
        

        【讨论】:

          【解决方案6】:

          只有“数组”验证可以确保值是一个数组,但对于您的具体情况,您必须创建一个自定义过滤器:

          Laravel 3:http://three.laravel.com/docs/validation#custom-validation-rules

          Laravel 4:http://laravel.com/docs/validation#custom-validation-rules

          【讨论】:

            【解决方案7】:

            AppServiceProvider.php

            Validator::extend('integer_array', function($attribute, $value, $parameters)
            {
                return Assert::isIntegerArray($value);
            });
            

            Assert.php

            /**
             * Checks wheter value is integer array or not
             * @param $value
             * @return bool
             */
            public static function isIntegerArray($value){
                if(!is_array($value)){
                    return false;
                }
            
                foreach($value as $element){
                    if(!is_int($element)){
                        return false;
                    }
                }
            
                return true;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-07-04
              • 2021-07-02
              • 2017-10-16
              • 2020-08-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-11-19
              相关资源
              最近更新 更多