php关联数组:比较相邻值

php关联数组:比较相邻值,php,Php,我想检查表单中相同2个输入字段的多行。如果一个为空,而另一个为空,则验证应失败 我已经创建了一个基于多个输入字段(e_me_id、e_md_编号、e_md_id1、e_md_编号1、p_me_id、p_md_编号……)的关联数组 $pattern='(md_number|me_id)'; foreach($_POST as $field => $value) { $success = preg_match($pattern, $field); if ($success) {

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

我已经创建了一个基于多个输入字段(e_me_id、e_md_编号、e_md_id1、e_md_编号1、p_me_id、p_md_编号……)的关联数组

$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来检查第一个/第二个都是null或者都是填充的。。。第三/第四、第五/第六次相同。。。等等

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

任何想法或不同的方法


提前感谢。

您可以这样做来验证配对:

// 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";
虽然对我来说,还不太清楚您希望
$x
$fieldname
for
-循环中是什么。如果两个测试值均为空或均为“已填充”,则将
$x
设置为
'
,如果其中只有一个为空,则将其设置为
$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'));

对于($i=0,$x=0;$i您可以这样做来验证对:

// 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";
虽然对我来说,还不太清楚您打算
$x
$fieldname
for
-循环中是什么。这会将
$x
设置为
'
,如果两个测试值都是空的或都是“填充的”,并且当其中只有一个是空的时,它会将其设置为
$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'));

for($i=0,$x=0;$i您可以使用运算符进行比较。您可以使用运算符进行比较。您的代码工作得很好……我仍在思考中……非常感谢。我是否可以使用缩写if语句设置变量而不是回显消息,例如
(空($tst[$keys[$i]])==empty($tst[$keys[$i+1]])?$x='':$x=fieldname)
是的,您可以@osieman(有时只测试它是否有效会更快:-)),我尝试过,但它总是选择true。在这种情况下,它应该有输出“1”。@osieman,代码片段中的
$x
只返回上次执行的测试的结果。请查看我修改的答案(在底部)。你的代码工作得很好…我还在想办法…非常感谢。我可以使用缩写if语句来设置变量而不是回显消息吗,例如
(empty($tst[$keys[$I]])==empty($tst[$keys[$I+1]])?$x=':$x=fieldname)
可以@osieman(有时只测试它是否工作会更快:-)我试过了,但总是选择正确。在这种情况下,它应该有输出“1”@osieman,代码段中的
$x
仅返回上次执行的测试的结果。请看一下我修改过的答案(在底部)。