Php 当只需要检查数组的某些键/值时,该怎么办?

Php 当只需要检查数组的某些键/值时,该怎么办?,php,arrays,Php,Arrays,我有大量的表单字段(上次统计为34个)分布在整个站点上,因此我正在编写一个catch尽可能多的函数来执行批量验证,然后我将在执行的基础上处理不太常见的项 在某些$\u POST键上,我需要检查值是否为字母数字 例如,需要检查$\u POST['username']$\u POST['firstname']不需要检查,因为它只能是字母(我们稍后会检查) 我本来打算做如下的事情,但似乎我跳过了这么多,只检查了5或6个值,造成了很大的开销 foreach($_POST as $key => $v

我有大量的表单字段(上次统计为34个)分布在整个站点上,因此我正在编写一个catch尽可能多的函数来执行批量验证,然后我将在执行的基础上处理不太常见的项

在某些
$\u POST
键上,我需要检查值是否为字母数字

例如,需要检查
$\u POST['username']
$\u POST['firstname']
不需要检查,因为它只能是字母(我们稍后会检查)

我本来打算做如下的事情,但似乎我跳过了这么多,只检查了5或6个值,造成了很大的开销

foreach($_POST as $key => $value){
        if($key == 'descr'){ continue; }
        if($key == 'imageUploads'){ continue; }
        // etc
        // etc
        // etc

        if(!ctype_alnum($value)){
             $notAlNum[] = $key.' is not alphnumeric;
        }
    }
有没有其他方法可以避免在整个post数组中循环的开销

根据答案拼凑而成这是我提出的解决方案,虽然很难看,但很有效。

if(in_array($_POST['userName'] || $_POST['pswd'] || $_POST['oldpswd'] || $_POST['activationCode'],$_POST)){

        $toCheck = array($_POST['userName'],$_POST['pswd'],$_POST['oldpswd'],$_POST['activationCode']);

        foreach($toCheck as $key => $var) {
            if(empty($var)){ continue; }
            if(!ctype_alnum($var)){
                 $errormsg[] = $var.' is not alphnumeric';
            }
        }
    }

只需检查这几个变量

$toCheck = array('firstVar2Check','secondVar2Check',...);
foreach($toCheck as $var) {
    if(!ctype_alnum($_POST[$var])){
         $notAlNum[] = $var.' is not alphnumeric';
    }
}
您可以使用PHP的功能,而不是直接访问$\u POST。这允许您清理和验证数组的内容(例如,它是否为字母数字),通常被认为比直接访问数组更安全。例如:

$user = filter_input(INPUT_POST, 'user', FILTER_VALIDATE_REGEXP, ['options' => [
        'regexp' => '/[a-z_\-0-9]/i']
    ]);

这确实意味着要遵循与上面描述的稍有不同的模式——现在,当您掌握每个POST变量时,您将进行验证。您只需要为每个变量决定如何对其进行加密/过滤。

为什么不创建一个要检查的键数组?e、 g

foreach([ 'username' => true, 'otherField' => false ] as $field => $required) {
   if ((!isset($_POST[$field]) || strlen($_POST[$field])) == 0 && !$required) continue;
   if (!isset($_POST[$field]) || strlen($_POST[$field]) == 0) {
      $errors[] = "$field is required";
   } 
   else if (!ctyle_alnum($_POST[$field])) {
      $errors[] = "$field is not alphanumeric";
   }
}

那么您就不会浪费时间处理数组中的无关数据了:为什么在执行foreach循环时需要检查它呢,,,你可以直接通过做$_POST['username']来检查它,我希望我永远不会用34个字段填写表单。它不是一个表单,而是分布在整个网站上的几个表单。。。我本应该提到的,因为我现在看到了我将要投票的回答可能有什么问题。我在数组中添加了if(in_array)(我可以进一步细分它,对吗?不确定你在问什么。你不确定是否
$\u POST[$var]
存在吗?不是你,在我发布后,我意识到我忘了提到这些$\u POST变量并非都在一个表单上,它们分布在多个表单上,该函数是一个包罗万象的函数,可以在一个函数中完成大部分验证。正如我写的问题一样,这是正确的答案。这个答案与注释相结合,使我能够你知道我需要做什么,所以我投了赞成票!谢谢!!