检查变量是否为空时如何在 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;
我写了 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;