检查变量是否为空时如何在 PHP 中使用 SWITCH 语句?

How to use SWITCH statement in PHP when checking if variables not empty?

我写了 IF 语句来检查变量是否不为空:

  if ( !empty( $firstname )) {
    $data = array_merge( $data, array( 'first_name' => $firstname )); 
  }
  if ( !empty( $lastname )) {
    $data = array_merge( $data, array( 'last_name' => $lastname )); 
  }
  if ( !empty( $email )) {
    $data = array_merge( $data, array( 'email' => $email )); 
  }
  // and there are even more statements then these 3 ...

我觉得这太干了,我试着用 SWITCH 代替 IF:

switch( true ){
  case ( !empty( $firstname )):
    $data = array_merge( $data, array( 'first_name' => $firstname ));
  case ( !empty( $lastname )):
    $data = array_merge( $data, array( 'last_name' => $lastname ));
  case ( !empty( $email )):
    $data = array_merge( $data, array( 'email' => $email ));

最后我得到了一个包含所有这 3 个元素的数组,即使其中一个变量为空。我做错了什么?

P.S。我做不到 IF(!empty(a) && !empty(b) && !empty(c)) 因为需要分别检查每个条件。

一个简单的解决方案是

$data = array_merge($data, array_filter(compact("firstname", "lastname", "email")));

Compact 是一个方便的函数,可将变量名列表转换为其值的数组。数组过滤器将删除所有空元素,最后您可以将它与 $data

合并

出于兴趣,我测试了您的代码,因为我对您最后发表的评论感到好奇,即即使变量为空,它仍然包含在开关中。我测试了一下

    $firstname = '';//also tested with $firstname = null;
    $lastname = 'joe';
    $email = 'joe@null.com';
    $data = [];
    switch( true ){
      case ( !empty( $firstname )):
        $data = array_merge( $data, array( 'first_name' => $firstname ));
      case ( !empty( $lastname )):
        $data = array_merge( $data, array( 'last_name' => $lastname ));
      case ( !empty( $email )):
        $data = array_merge( $data, array( 'email' => $email ));
    }
    print_r($data);

输出为:

Array ( [last_name] => joe [email] => joe@null.com )

这是我所期望的 - 我只是添加这个,因为我认为你可能有你认为是空的变量,但实际上不是。因此,在实施已发布的解决方案之前,请确保您还检查变量是否处于您认为的状态

您可以使用可变变量循环并测试非空。

<?php
$firstname = 'Paul';
$email     = 'paul@example.com';

$data = ['age' => '34'];
foreach(['firstname', 'lastname', 'email'] as $name) {
    if(!empty($$name)) {
        $data[$name] = $$name;
    }
}

var_export($data);

输出:

array (
'age' => '34',
'firstname' => 'Paul',
'email' => 'paul@example.com',
)

compact 函数与 array_filter 结合使用是一个很好的方法。我只是分享使用三元运算符的替代方法来解决您的问题。

$data = !empty($firstname) ? array_merge( $data , [ 'firstname' => $firstname] ) : $data;
$data = !empty($lastname)  ? array_merge( $data , [ 'lastname' => $lastname]  ) : $data;
$data = !empty($email)  ? array_merge( $data , [ 'email' => $email] ) : $data;