时间:2010-12-02 01:39:40

标签: php arrays multidimensional-array intersection

好的,我有一个很定制的问题,所以请耐心等待。

我基本上有两组数据需要与很多不同的可能性进行比较。

$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的k / v有效
  2. 如果$data键/值对与$blueprint键和嵌套数组中的值匹配,则$data的k / v有效
  3. 如果$data数组忽略$blueprint中存在的键/值对,则$data'sk / v如果不在{{1}中,则可能仍然有效} array
  4. 如果$required数组提供$data中不存在的键/值对,则$blueprint的k / v无效
  5. 如果键/值对中的$data键与没有定义键的$data值匹配,则$blueprint的k / v仍然有效。但是,如果$data同时定义了键和值,则$blueprint的k / v必须满足规则1的要求才有效。
  6. 我想对几个$data k / v施加字符限制,如果$blueprint'sk / v超过此字符数限制,$data sk / v是无效
  7. 如果$data'sk / v无效,那么我想以某种方式将错误与特定的k / v相关联,以描述它无效的原因(超出字符限制,一般错误等)或许错误将在第三个数组中定义?

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

    我认为这是正确的,在我写这篇文章时,我的大脑有点融化,所以请不要犹豫,问一下是否感到困惑。我最好只是单独验证每个k / v吗?

    让我们看看谁是那里的brainiac。

5 个答案:

答案 0 :(得分:2)

我对您的示例代码进行了一处更改。如果你把名字变成一个键而不是一个数字键值,这似乎更容易。

$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()验证长度。

答案 1 :(得分:1)

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

我觉得有点傻,但这是一种蛮力方法。 #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.
    }
}

答案 4 :(得分:0)