我有一个多维数组,需要验证该数组是否包含正确图层上的必填字段。
有没有很好的方法来实现这一目标?输入可以是数组或 JSON。
到目前为止我的方法:
假设输入数组如下:
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 层返回 false
- 但主要问题是这个函数的逻辑问题。现在它不检查是否设置了必填字段,它只检查深度的输入值是否在必填字段中。这种行为是错误的。
我也尝试使用比较数组,但由于有多个条目,我无法将所有条目与强制数组进行比较。
非常感谢任何帮助、建议或解决方案。
谢谢