2010-12-02 75 views
1

好的,我有一个非常定制的问题,所以忍受着我。PHP比较阵列值进行验证

我基本上有两组数据,我想与许多不同的可能性进行比较。

$data = array(
      'object'=>'ball', // Should check VALID (Rule 2) 
      'color'=>'white', // VALID (Rule 2) 
      'heavy'=>'no', // VALID (Rule 1) 
      'name'=>'wilson', // VALID (Rule 5) 
      'funny'=>'no'  // INVALID (Rule 4) 
      ); 

$data_2 = array(
      'object'=>'box', // VALID (Rule 2) 
      'color'=> 'blue', // VALID (Rule 2) 
      'texture'=>'hard', // VALID (Rule 1) 
      'heavy'=>'yes', // INVALID (Rule 4) 
      'stupid'=>'no'  // INVALID (Rule 4) 
           // Name is INVALID because it is missing (Rule 3) 

); 

$required = array(
      'color'=>array('white','blue'), 
      'heavy'=> 'no', 
      'name' 
); 

$errors = array(
     'color'=>array('required'=>'Color is Required','invalid'=>'Color invalid') 
     'object'=>array('invalid'=>'Object invalid'), 
     'texture'=>array('invalid'=>'Texture invalid'), 
     'heavy'=>array('required'=>'Heavy is Required','invalid'=>'Heavy invalid'), 
     'name'=>array('required'=>'Name is Required','max_char'=>'Name exceeds char limit', 
     'invalid'=>'Invalid item provided',   
); 

$blueprint = array(
       'object'=>array('box','ball'), 
       'color'=>array('blue','white'), 
       'texture'=>'hard', 
       'heavy'=>'no', 
       'name' 
      ); 

我想要做的就是运行$data通过$blueprint,确保以下内容:

  1. 如果$data键/值对的$blueprint键/值对匹配,$data“SK/v有效
  2. 如果$data键/值对匹配$blueprint键和来自嵌套数组的值,则$data'sk/v有效
  3. 如果$data阵列省略存在于$blueprint一个键/值对,$data“SK/v的可能仍然是有效的,如果它不位于$required阵列中
  4. 如果$data阵列提供一个密钥/值对其中做在$blueprint不存在的,$data“SK/v是无效
  5. 如果从一个键/值对的$data键匹配的$blueprint值没有定义键,$data” SK/v仍然可以是有效的。但是,如果$blueprint同时具有定义的键和值,则$data的k/v必须满足规则1的要求才有效。
  6. 我想强加给几个$blueprint K/v,其中,如果$data的字符限制“SK/V超过该字符数限制,$data SK/V无效

如果$data” sk/v是无效的,然后我想以某种方式将错误与特定的k/v关联起来,描述为什么它是无效的(超过字符限制,一般错误等)。也许错误会在第三个数组中定义?

我查看了array_intersect_assoc,但不确定这是否超出了该功能的范围。此外,$blueprint中会有大量的值,所以我需要尽可能多样的东西。

我认为这是正确的,当我写这篇文章的时候,我的大脑融化了,所以请不要犹豫,如果感到困惑,请不要犹豫。我最好单独验证每个k/v吗?

让我们看看谁是那里的聪明人。

+0

你可以添加各种阵列为我们一起玩的;) – 2010-12-02 02:12:50

+0

肯定,给我几分钟到这... – 2010-12-02 03:37:23

回答

2

我觉得有点傻,但这里有一个蛮力的方法。 #6你可以免费获得,因为它在任何意义上都不在阵列中。

foreach ($data as $k => $v) { 
    if (empty($blueprint[$k])) { 
     // (3) Data defines a key that isn't defined in blueprint. 
    } else { 
     if (is_array($blueprint[$k])) { 
      if (in_array($v, $blueprint[$k])) { 
       // (2) Data defines a valid value in a blueprint list. 
      } else { 
       // (also 4) Data defines a value not in a blueprint list. 
      } 
     } else if ($v == $blueprint[$k]) { 
      // (1) Data defines a value in the blueprint. 
     } else if (in_array($v, $blueprint)) { 
      // (5) Data is in the blueprint without a key. 
     } else { 
      // (4) Data is invalid. 
     } 
    } 
} 

编辑:这是用于检查$ blueprint是否有$ data没有定义的键的循环。在运行之前,可能需要切换以确保这是必要的(在前面的块中)。

foreach ($blueprint as $k => $v) { 
    if (empty($data[$k])) { 
     // (6) Data doesn't have a required key from blueprint. 
    } 
} 
0

是的,你可能必须自己编码,因为我不认为有任何内部函数可以做到这一点。应该不会太难,因为您已经对您的需求有了很好的描述 - 只需将其翻译成PHP即可。

+0

是的,我怀疑任何功能的存在,将做到这一点,但我真正在寻找如何构建这个功能的方向,因为我写的任何东西都会像糊涂一样出现。 – 2010-12-02 01:48:49

2

真相被告知,这本身并不困难,它的复杂性。您可以使用array_map函数来简化映射;它看起来像这样:

function validate_data($data, $blueprint) 
{ 
    // an implementation of all that stuff you wrote using lots of 
    // for loops and if statements 
} 

array_map('validate_data', $data, $blueprint); 

查看手册页以了解更多细节。你可以这次是糠:) :)

+0

我喜欢这样的外观,会看到我能想出什么并回报 – 2010-12-02 02:05:09

+0

困难是在旁观者的眼中....这个功能让我发疯.. – 2010-12-02 03:57:44

2

你想使用in_array()。它将搜索数组的值并查找不同的值,例如。

foreach($data as $key => $val) { 
    $check = in_array($val, $blueprint); 
    if($check === false) { 
    print("invalid"); 
    die; 
    } 
} 
3

我对示例代码做了一处更改。如果您将名称变为一个键而不是数字键值,看起来更容易。

$required = array(
'color'=>array('white','blue'), 
'heavy'=> 'no', 
'name' => '', # name now a key 
); 

这现在适用于您的许多规则。主要检查所需的密钥,并且不存在必需的和蓝图以外的额外密钥。

# check required keys 
$missing = array_diff_key($required, $data); 
if($missing) { 
    var_dump($missing); # react to missing keys 
} 

# check against all possible keys 
$possible = array_merge_recursive($blueprint, $required); 
$extra = array_diff_key($data, $possible); 
if($extra) { 
    var_dump($extra); # react to extra keys 
} 

现在对于其余的我真的需要知道你到畸形数据等如何应对,但如果你的数据,现在通过这两项测试,你在你认为合适的方式作出反应,你应该清楚迭代通过阵列并使用array_search()filter_var()进行验证以检查长度。