在foreach循环中将两个数组相互比较的最佳方法是什么?
我有两个数组,其中一个包含布尔值,另一个包含实数值。
第一个数组是某种配置文件,我告诉哪个字段是必填字段TRUE
或可选FALSE
:
$rules = array(
'fieldname1' => TRUE,
'fieldname2' => FALSE,
'fieldname3' => TRUE,
'fieldname4' => TRUE,
'fieldname5' => FALSE,
'fieldname6' => FALSE,
'fieldname7' => TRUE,
'fieldname8' => TRUE
);
另一个保存传入数据的数组:
$fields = array(
'fieldname1' => 'some value',
'fieldname3' => 'some value',
'fieldname4' => 'some value',
'fieldname7' => 'some value',
'fieldname8' => 'some value'
);
如何在foreach()
循环中进行检查,以便$fields
数组将每个fieldnameX
或(键/索引)与另一个名为{{的数组进行比较1}}?
例如:$rules
是必需的,因为它有一个bool $rules['fieldname1']
。因此,在TRUE
中,名为foreach($fields as $field)
的{{1}}不应为空,null或false,如果是,则显示错误。
这是我到目前为止所做的一项功能,它没有完全符合我的要求:
$field
答案 0 :(得分:2)
// Goes through all the rules
foreach($rules as $key => $value)
{
// access all fields that are marked as required i.e key set as TRUE
if ($value)
{
//for those whose value is TRUE, check whether the corresponding field is set or
// whether it is empty (NULL,false)
if(!isset($fields[$key]) || empty($fields[$key]))
{
die('Required field does not exist');
}
}
}
答案 1 :(得分:1)
foreach ($fields as $field => $value)
{
if (array_key_exists($field, $rules) && $rules[$field] === true)
{
if (!$value || $value == "" || $value === null)
{
die(); // return false;
}
}
}
return true;
答案 2 :(得分:1)
我认为您可以在PHP中使用数组函数。我要做的第一件事就是在规则数组上应用array_filter。这样,您将只保留TRUE值(及其索引,因为array_filter保持索引/值关联)。 然后我会使用array_intersect_key仅保留字段var中感兴趣的字段。再次使用自定义回调的array_filter来执行您想要执行的验证。
答案 3 :(得分:0)
$rules = array('name' => TRUE, 'phoneNumber' => TRUE, 'age' => FALSE);
$submittedFields = array( 'name' => 'aspirinemaga', 'age' => 38, 'phoneNumber' => '');
$requiredFields = array_keys(array_filter($rules));
$validFields = array_keys(array_filter($submittedFields));
$missingFields = array_diff($requiredFields, $validFields);
鉴于
$rules = array('name' => TRUE, 'phoneNumber' => TRUE, 'age' => FALSE);
$submittedFields = array( 'name' => 'aspirinemaga', 'age' => 38, 'phoneNumber' => '');
PhoneNumber在这里错了。
$requiredFields = array_keys(array_filter($rules));
这为您提供了TRUE
。
$validFields = array_keys(array_filter($submittedFields));
同样,对于布尔转换,你对ok的定义与php truth table相同。如果您有更高级的检查,可以将函数名称传递给array_filter(见下文)。
$missingFields = array_diff($requiredFields, $validFields);
这将为您提供$requiredFields
中存在但不在$validFields
中的所有字段名称。
$rules = array('name' => 'MORE_THAN_3', 'phoneNumber' => TRUE, 'age' => 'POSITIVE');
$submittedFields = array( 'name' => 'aspirinemaga', 'age' => 38, 'phoneNumber' => '');
$requiredFields = array_keys(array_filter($rules));
function validateField($key, $value){
// get the rule (assuming no submittedFields that have no rule)
$rule = $rules[$key];
switch($rule){
case 'MORE_THAN_3': return strlen($value) > 3; break;
case 'POSITIVE': return $value > 0; break;
}
// in case of TRUE/FALSE
return TRUE;
}
$validFields = array_keys(array_filter("validateField", $submittedFields, ARRAY_FILTER_USE_BOTH));
$missingFields = array_diff($requiredFields, $validFields);
如果您想进行更高级的验证,可以将其很好地集成到上述解决方案中。
假设您希望name
超过3个字符且age
为正数。将其写入您的规则:
$rules = array('name' => 'MORE_THAN_3', 'phoneNumber' => TRUE, 'age' => 'POSITIVE');
$submittedFields = array( 'name' => 'aspirinemaga', 'age' => 38, 'phoneNumber' => '');
必填字段仍然相同(检查是否缺少一个字段)。
$requiredFields = array_keys(array_filter($rules));
现在您的验证功能类似于:
function validateField($key, $value){
// get the rule (assuming no submittedFields that have no rule)
$rule = $rules[$key];
switch($rule){
case 'MORE_THAN_3': return strlen($value) > 3; break;
case 'POSITIVE': return $value > 0; break;
}
// in case of TRUE/FALSE
return TRUE;
}
将其传递到array_filter
并添加到ARRAY_FILTER_USE_BOTH
旗帜:
$validFields = array_keys(array_filter("validateField", $submittedFields, ARRAY_FILTER_USE_BOTH));
你遗失的菲尔兹保持不变。
$missingFields = array_diff($requiredFields, $validFields);
这只适用于PHP 5.6+(因为ARRAY_FILTER_USE_BOTH)。未经测试,应该有效。
答案 4 :(得分:0)
$requiredField = array();
foreach($rules as $key=>$value) {
if($value == true && (!isset($fields[$key]) || $fields[$key] == "" )) {
$requiredField[] = $key;
}
}
if(count($requiredField) > 0) {
echo implode(',',$requiredField)." Are Required";
die;
}