编码和解析php数组的问题

时间:2019-02-20 22:31:20

标签: php arrays json

我有一个php文件,可为我验证一个简单的表单条目。我将每个错误(在验证期间发现的错误)分配给一个变量($ name_errors,$ phone_errors和$ email_errors)。这些变量中的每个变量都包含一个字符串(“请输入有效的姓名”,“请输入有效的电话号码”和“请输入一个有效的电子邮件地址”。然后,我创建一个包含这些变量的数组,称为$ errors。因此该数组看起来像这样

$errors = array($name_errors, $phone_errors, $email_errors);

一旦有了$ errors数组,我将通过一条if语句运行,如下面的代码所示。本质上,如果发现错误,则该语句应该对$ errors数组进行JSON_Encode并退出脚本。如果没有发现错误,脚本将继续发送邮件。我的问题是,无论数组为空(即包含通过Var_dump()确认的所有空值)还是包含实际错误值,if语句始终将其识别为包含数据,并且将停止上述脚本。不知道发生了什么。我很难解决此问题。任何帮助将不胜感激。

 if ($errors != null){

 var_dump($errors);

  echo json_encode( $errors );
    exit;
  };

这是我从var_dump(array)获得的结果,JSON编码始终认为它不等于$ errors = null:

结果:[null,null,null] contact_form.htm:323:13

2 个答案:

答案 0 :(得分:1)

充满null值的数组不为空,也不等于null。考虑一下:

$errors = [null, null, null];
echo $errors == null ? "true\n" : "false\n";
echo empty($errors) ? "true\n" : "false\n";

输出:

false
false

相反,您可以测试array_filter($errors)的输出,如果$errors中的所有值为空,则输出将为空数组:

echo empty(array_filter($errors)) ? "true\n" : "false\n";

输出:

true

因此,请尝试将代码更改为:

if (!empty(array_filter($errors))) {

Demo on 3v4l.org
Manual for array_filter

答案 1 :(得分:1)

考虑这种替代方法:使用一个变量$errors = []。在验证输入时,请添加该数组中相应键下发生的所有错误,例如

if (!validate($name)) {
    $errors['name'] = 'Please enter a valid name';
}

然后,如果没有错误,则数组将为空,因此有条件地进行打印将变得更加简单。

if ($errors) {                   // empty array evaluates as false, non-empty as true
   echo json_encode($errors);
   exit;
}

将所有错误汇总在一个变量中,而不是使用单独的错误可能是有利的。一个是,当您添加另一个表单字段时,您将不必记住将其错误变量添加到收集所有不同错误变量的数组中。