我正在构建一个web API,它接受一组数据。我想检查此数组中是否有某些键,如果所需的键不存在,则返回false;如果可选键不存在,则在数组中设置该键-值对。
造成混淆的原因是我的输入数组可能将数组作为值。例如,假设我输入的数组如下所示:
$input_array = array(
’name’ => ‘Adam’,
‘address’ => array(
‘number’ => 12,
‘street’ => ‘My Street’
)
);我有必需的密钥:
$required_keys = array(
‘name’,
‘address’ => array(
‘number’,
‘street’
)
);可选键:
$optional_keys = array(
‘address’ = array(
‘postcode’ => ‘WA1'
)
);我正在努力找到一种方法来针对这两种类型的测试数组(输入和可选)来测试我的输入数组。
应该发生的情况是: 1)所有必需的密钥都应该匹配。2)如果任何可选键不存在,则将它们设置为可选键数组中的键值对。
我知道(但没有经验)正则表达式。但是,我知道PHP有一个名为http_build_query(mixed $array);的函数,它接受一个数组并将其转换为URL查询字符串。我的想法是,也许我可以将输入数组转换为URL字符串,然后将其与由两个测试数组(必需和可选)组成的正则表达式进行比较。这行得通吗?
如果有人有其他的想法,我很想知道。谢谢
更新:附加的非可疑输出

更新2:附加新输出

更新3:当前代码:
static public function static_test_required_keys(Array $required_keys_array, Array $input_array)
{
$missing = array();
foreach ($required_keys_array as $key => $value)
{
if (empty($input_array[$key]))
{
$missing[] = $key;
}
else if (isset($input_array[$key]) && is_array($input_array[$key]))
{
$missing = array_merge(Inputter::static_test_required_keys($value, $input_array[$key]), $missing);
}
}
return $missing;
}更新4:新代码。
tatic public function static_test_required_keys(Array $required_keys_array, Array $input_array)
{
$missing = array();
foreach ($required_keys_array as $key => $value)
{
if (! isset($input_array[$key]))
{
$missing[] = $key;
}
else if (isset($input_array[$key]) && is_array($input_array[$key]))
{
$missing = array_merge(Inputter::static_test_required_keys($value, $input_array[$key]), $missing);
}
}
return $missing;
}已将代码从isempty()更改为isset()。这一页给出了两者之间的区别。https://www.virendrachandak.com/techtalk/php-isset-vs-empty-vs-is_null/
发布于 2015-02-06 22:50:04
具有对称input+required密钥的新改进版本...
$input_array = array(
'name' => 'Adam',
'address' => array(
'number' => 12,
'street' => '',
'phones' => array('home_phone'=>'','fax'=>'555-1212')
)
);
$required_keys = array(
'name' => '',
'address' => array(
'number' => '',
'street' => '',
'phones' => array('home_phone'=>'')
)
);
function check_required( $input, $required ){
$missing = array();
foreach ($required as $k=>$v) {
if (empty($input[$k])) {
$missing[] = $k;
} else if (is_array($v)) {
$missing = array_merge( check_required( $input[$k], $v ), $missing );
}
}
return $missing;
}
$missing = check_required( $input_array, $required_keys );
if (!empty($missing)) echo 'Please enter your '. implode(', ', $missing);请在此处查看沙箱... http://sandbox.onlinephpfunctions.com/code/23b908b873b053aefb37770f636b63bba2db960b
发布于 2015-02-06 22:58:49
必填字段
您可以使用array_diff检查输入中是否缺少任何必填字段。
可选字段
您可以使用array_merge为缺少的字段设置默认值。
代码
$requiredKeys = [
'foo',
'baz',
];
// Take the keys from input
$inputKeys = array_keys($input);
$missingRequiredKeys = array_diff($requiredKeys, $inputKeys)
if (!empty($missingRequiredKeys)) {
throw new InvalidArgumentException(...);
}
// Setup default values for missing optional keys
$defaultValues = [
'bar' => 'bas',
];
$result = array_merge($defaultValues, $input);子数组
对于选中必填字段或设置默认值,需要在各个函数中重复上面的代码。
function validateInput(array $input) {
// Above code
// Validate field subkeys from a parent required field.
// or optional field with default value.
validateFoo($input['foo']);
// Validate field subkeys from a parent optional field without default value.
if (array_key_exists('optional_input_without_default', $input)) {
validateAnotherFooInput($input['optional_input_without_default']);
}
}其他选项
您可以通过多种方式使用数组交集、比较和合并来检查Array Book中的那些函数族
array_diff_assoc -使用额外的索引检查计算数组之间的差异
array_diff_key -使用键进行比较来计算数组的差异
array_diff_uassoc -使用由用户提供的回调函数执行的附加索引检查来计算数组之间的差异
array_diff_ukey -使用键上的回调函数计算数组的差值以进行比较
array_diff -计算数组的差
array_intersect_assoc -使用额外的索引检查来计算数组的交集
array_intersect_key -使用键计算数组的交集以进行比较
array_intersect_uassoc -使用额外的索引检查计算数组的交集,通过回调函数比较索引
array_intersect_ukey -使用键上的回调函数计算数组的交集以进行比较
array_intersect -计算数组的交集
array_udiff_assoc -使用额外的索引检查计算数组之间的差异,通过回调函数比较数据
array_udiff_uassoc -使用额外的索引检查计算数组的差异,通过回调函数比较数据和索引
array_udiff -通过使用回调函数进行数据比较来计算数组之间的差异
array_uintersect_assoc -使用额外的索引检查计算数组的交集,通过回调函数比较数据
array_uintersect_uassoc -使用额外的索引检查计算数组的交集,通过回调函数比较数据和索引
array_uintersect -计算数组的交集,通过回调函数比较数据
发布于 2015-02-06 22:55:15
// Check if required keys exist
foreach( $required_keys as $req_key => $req_val )
{
if( !array_key_exists( $req_key, $input_array )
{
// if key exists check if it has values set in an array and if
// these are also in $input_array
if( is_array( $req_val ) )
{
foreach( $req_val as $inner_req_key )
{
if( !isset( $input_array[$req_val][$inner_req_key] )
{
echo "Required key '$req_key' is missing value '$inner_req_key'.";
}
}
}
echo "Required key '$req_key' is missing.";
}
}
// Check if optional keys are defined
foreach( $optional_keys as $opt_key => $opt_val )
{
// Check if key exists, if not copy optional key=>value as whole
if( !array_key_exists( $opt_key, $input_array )
{
$input_array[ $opt_key ] = $opt_val;
}
else // key exists
{
// if key exists check if it is an array and if optional elements
// exist, else add them
if( is_array( $opt_key ) )
{
foreach( $opt_key as $inner_opt_key => $inner_opt_val )
{
// key is not set, so get from %optional_keys
if( !isset( $input_array[$opt_key][$inner_opt_key] )
{
$input_array[$opt_key][$inner_opt_key] = $inner_opt_val;
}
}
}
}
}很久没有PHP了,但这可能会有帮助。PS:没有经过测试,并添加了一些解释。HTH
https://stackoverflow.com/questions/28368194
复制相似问题