我有一个多维数组,需要验证数组是否包含正确图层上的必填字段。将多维数组与强制值进行比较
是否有很好的方法来实现这一目标?输入可以是数组或JSON。
我至今approche:
让我们假设输入数组如下:
Array (
[key] => key string
[sub] => Array (
[0] => Array (
[id] => 123456
[src] => source string
[src_ids] => Array (
[0] => 1
[1] => 2
[2] => 3
[3] => 4
)
[data] => Array (
[a_data] => a string
[b_data] => b string
[c_data] => c string
)
)
[1] => Array (
[id] => 557799
[src] => source string
[src_ids] => Array (
[0] => 1
[1] => 2
)
[data] => Array (
[a_data] => a string
[b_data] => b string
[c_data] => c string
)
)
)
)
强制值:
sub, id, src, src_ids, data, a_data
可选值有一切,如:
key, 0 (of sub), 0-3 (of src_ids), b_data, c_data
我想有一个函数检查任何输入数组与强制字段。 我的想法是基于在类似的层的阵列来创建强制值:
$mandatory = array(
1 => array('sub'),
3 => array('id', 'src', 'src_id', 'data'),
4 => array('a_data')
);
的关键是该层的深度和阵列值是该层所允许的键名。
现在,我尝试通过输入数组抓取并检查重点是必填字段基于深度:
/**
*
* @param array $i input
* @param array $m mandatory
* @param integer $d depth
* @return boolean
*/
function validate($i, $m, $d=1) {
foreach($i as $k => $v) {
if(isset($m[$d])) {
if(!in_array($k, $m[$d])) {
return false;
} else {
if(is_array($v)) {
$d++;
validate($v, $m, $d);
}
}
} else {
if(is_array($v)) {
$d++;
validate($v, $m, $d);
}
}
}
return true;
}
但是,这将导致两个主要问题:
- 层数字4保存src_ids和数据的数组,但只有在数据中有必须的字段a_data。所以它会返回错误的层数4
- 但主要问题是这个函数的逻辑问题。现在它不检查必填字段是否设置,它只检查深度的输入值是否在必填字段中。这种行为是错误的。
我也尝试过使用比较数组,但是由于多个条目,我无法将所有条目与强制数组进行比较。
任何帮助,建议或解决方案,非常感谢。
谢谢
是否在适当级别的每个元素上都需要强制性元素,或者如果适当级别的元素之一具有强制性元素,那么整个输入被认为是好的?例如,如果'$ mandatory = array(3 => array('a','b'));'和'$ input = array(array('a'=> 1),array('b'=> 2 ));',答案是什么? – ghbarratt 2012-07-12 19:48:55
谢谢ghbarratt。答案应该是错误的,因为a和b对于拨款级别的每个元素都是强制性的。 – Talisin 2012-07-13 01:03:20