如何验证PHP数组的结构?

use*_*841 14 php arrays validation

是否有一个函数来确保任何给定的数组符合特定的结构?我的意思是具有特定的键名,可能是值的特定类型,以及任何嵌套结构.

现在我有一个地方,我想确保过去的数组有某些键,一对持有某种数据类型,一个子数组有特定的键名.我已经完成了很多乱跑,因为我将错误的数组传递给它,最后我就到了我有一堆

if ( ! isset($arr['key1']) ) { .... }
if ( ! isset($arr['key2']) ) { .... }
if ( ! isset($arr['key3']) ) { .... }
Run Code Online (Sandbox Code Playgroud)

如果我能事先检查一下阵列是否符合特定结构,我本可以节省大量时间和惊愕.理想情况下

$arrModel = array(
    'key1' => NULL ,
    'key2' => int ,
    'key3' => array(
        'key1' => NULL ,
        'key2' => NULL ,
      ),
);

if ( ! validate_array( $arrModel, $arrCandidate ) ) { ... }
Run Code Online (Sandbox Code Playgroud)

所以,我问的问题是,这已经存在,还是我自己写的?

Jef*_*ima 8

您可以使用Symfony 验证组件

安装:

 composer require symfony/validator doctrine/annotations
Run Code Online (Sandbox Code Playgroud)

用法:

$myArray = [
  'name' => ['first_name' => 'foo', 'last_name' => 'bar'],
  'email' => 'foo@email.com' 
];

$constraints = new Assert\Collection([
    'name' => new Assert\Collection([
        'first_name' => new Assert\Length(['min' => 101]),
        'last_name' => new Assert\Length(['min' => 1]),
    ]),
    'email' => new Assert\Email(),
]);

$validator = Validation::createValidator();
$violations = $validator->validate($myArray, $constraints);
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅如何验证原始值(标量值和数组)


Par*_*ney 7

它不存在于内置.

也许尝试像(未经测试):

array_diff(array_merge_recursive($arrCandidate, $arrModel), $arrModel)
Run Code Online (Sandbox Code Playgroud)