比较PHP foreach中的两个数组

时间:2014-12-19 09:31:26

标签: php arrays foreach codeigniter-2

在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

5 个答案:

答案 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)

使用PHP Array Functions

$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;
}