多次元配列があり、配列に正しいレイヤーの必須フィールドが含まれているかどうかを確認する必要があります。
それを達成するための良いアプローチはありますか?入力は配列または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;
}
しかし、これは2つの大きな問題を引き起こします。
- レイヤー番号4は、src_idsとデータの配列を保持しますが、データにのみ必須フィールドa_dataがあります。したがって、レイヤー番号4の場合はfalseが返されます。
- しかし、主な問題はこの関数の論理的な問題です。現在、必須フィールドが設定されている場合はチェックせず、深度の入力値が必須フィールドにあるかどうかのみをチェックします。この動作は間違っています。
比較配列も使用しようとしましたが、エントリが複数あるため、すべてのエントリを必須配列と比較できませんでした。
どんな助け、提案または解決策も大歓迎です。
ありがとう