首页 > 解决方案 > php关联数组:比较相邻值

问题描述

我想检查表单中相同 2 个输入字段的多行。如果一个为空而另一个不是,则验证应该失败。

我创建了一个基于表单中的几个输入字段(e_me_id、e_md_number、e_md_id1、e_md_number1、p_me_id、p_md_number ...)的关联数组。

$pattern='(md_number|me_id)';
foreach($_POST as $field => $value) {
    $success = preg_match($pattern, $field);
    if ($success) {

        $validate += [$field => $value];
        }   
}

 result of validate =(
[e_me_id] => 1 
[e_md_number] => 111 
[e_me_id2] => 2 
[e_md_number2] => 222 
[p_me_id] => 10 
[p_md_number] => 101010 
[f_me_id] => 16 
[f_md_number] => 161616 
[d_me_id] => 18 
[d_md_number] => 181818 )

我需要一些循环php来检查第一个/第二个是否都为空或都已填充...对于第三个/第四个、第五个/第六个...等等等等。

我尝试使用 prev($validate) 和 next($validate) 但无法使其正常工作。

任何想法或不同的方法。

提前致谢。

标签: php

解决方案


您可以这样做来验证对:

// assuming this is the array generated by your code ...
$tst= array("e_me_id" => 1,"e_md_number" => 111 ,
            "e_me_id2" => 2,"e_md_number2" => 222 ,
            "p_me_id" => 0,"p_md_number" => 101010 ,
            "f_me_id" => 16,"f_md_number" => 161616 ,
            "d_me_id" => 0,"d_md_number" => 0 );
// then this will do the validation of pairs:
$keys=array_keys($tst);
for ($i=0;$i<count($tst);$i+=2) 
  echo "$keys[$i] and "
    .$keys[$i+1]
    .(empty($tst[$keys[$i]]) == empty($tst[$keys[$i+1]])?'':' DO NOT')
    ." pass the validation.\n";

您可以在此处查看演示:https
://rextester.com/VEMUFJ14979 我更改了一些数字以演示不同的可能情况。

==在两个 -tests 之间使用运算符empty()等同于使用xor@Markus Zeller 建议的否定运算符。

编辑

“速记 if 语句”应如下所示:

$x = (empty($tst[$keys[$i]]) == empty($tst[$keys[$i+1]])?'':$fieldname);

$x尽管对我来说,您的意图和$fieldname在您的循环中还不是很清楚for。这将设置$x''如果 case 两个测试值都为空或两者都“填充”,并且它将设置为$fieldname只有其中一个为空。

您最近的评论使我相信您希望在 $x 中获得整体验证结果。为了得到这个,你必须在循环对时计算所有错误。像下面这样的东西应该这样做:

for ($i=0,$x=0;$i<count($tst);$i+=2){
  if (empty($tst[$keys[$i]]) != empty($tst[$keys[$i+1]])) $x++;
  // echo $keys[$i].", error count so far: $x\n";
}

echo ("here ".($x?'validation error!':'OK'));

在此处查看演示:https ://rextester.com/XTK88037


推荐阅读