我有一個多維數組,需要驗證數組是否包含正確圖層上的必填字段。將多維數組與強制值進行比較
是否有很好的方法來實現這一目標?輸入可以是數組或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