使用if(!empty),多个变量不在数组中

问题描述 投票:15回答:14

我试图用PHP中的if(!empty)函数来修饰一些代码,但我不知道如何将它应用于多个变量,当它们不是一个数组时(就像我之前必须做的那样)所以如果我有:

$vFoo       = $item[1]; 
$vSomeValue = $item[2]; 
$vAnother   = $item[3];

然后我想只在有值时才打印结果。这适用于一个变量,所以你有:

 if (!empty($vFoo)) {
     $result .= "<li>$vFoo</li>";
 }

我尝试了一些类似的东西

if(!empty($vFoo,$vSomeValue,$vAnother) {
    $result .= "<li>$vFoo</li>"
    $result .= "<li>$vSomeValue</li>"
    $result .= "<li>$vAnother</li>"
}

但是,当然,它不起作用。

php is-empty
14个回答
33
投票

你可以创建一个新的包装器函数,它接受多个参数并通过empty()传递每个参数。它的工作方式类似于isset(),仅当所有参数都为空时返回true,并在到达第一个非空参数时返回false。这是我想出来的,它在我的测试中起作用。

function mempty()
{
    foreach(func_get_args() as $arg)
        if(empty($arg))
            continue;
        else
            return false;
    return true;
}

旁注:“mempty”中的前导“m”代表“多重”。您可以随意调用它,但这似乎是最短/最简单的命名方式。除此之外......说起来很有趣。 :)

更新10/10/13:我应该添加,不像empty()或isset(),如果你传递一个未定义的变量或一个不存在的数组索引,这个mempty()函数将哭泣血腥谋杀。


0
投票

我不是百分百肯定我明白你要做什么,但这里有几个可能的答案:

这将仅在不为空时返回每个变量:

function printIfNotEmpty($var) {
  if (!empty($var)) {
    return '<li>' . $var . '</var>';
  }
  return '';
}
$result .= printIfNotEmpty($vFoo);
$result .= printIfNotEmpty($vSomeValue);
$result .= printIfNotEmpty($vAnother);

或者如果它们都不为空,这个将添加所有三个:

if (!empty($vFoo) && !empty($vSomeValue) && !empty($vAnother)) {
  $result .= '<li>' . $vFoo . '</li>';
  $result .= '<li>' . $vSomeValue . '</li>';
  $result .= '<li>' . $vAnother . '</li>';
}

0
投票

伙计们,非常感谢您的所有回复,我根据所有可能的答案创建了一个脚本,这实际上帮助我学习PHP的语法,这是我的大多数错误背后的原因:)所以这里是

$vNArray ['Brandon']  = $item[3]; 
$vNArray['Smith']= $item[4]; 
$vNArray ['Johnson']= $item[5];
$vNArray ['Murphy']= $item[6];
$vNArray ['Lepsky']= $item[7];

foreach ($vNArray as $key => $value){

    if(!empty($value)){
        $result  .= "\t\t\t\t<li><strong>$key</strong>"  .$value.   "</li>\n";
}

我现在只需要弄清楚如何使这些不同。那么我可以通过以下方式访问每一个吗?

$result  .= "\t\t\t\t<li><strong>$key[0]</strong>"  .$value. "</li>\n";
$result  .= "\t\t\t\t<li><a href="thislink.com">$key[3]</a>"  .$value. "</li>\n";

多谢你们!


0
投票

为什么不这样:

foreach(array_filter($input_array) as $key => $value) {
    // do something with $key and $value
}

0
投票

仅供记录:array_reduce也适用。

if (!array_reduce($item, function($prev_result,$next) {
    return $prev_result || empty($next); // $prev_result will be initial null=false
})) {
    // do your stuff
}

0
投票

如果只使用字符串,您可以尝试以下方法:

if(empty($str1.$str2.$str3)){ /* ... */ }

注意,empty(0)将返回true,而empty('0'。'0')和empty('0')则不会返回true。


18
投票

你需要写一个条件链。使用&&测试多个变量,每个变量都有自己的empty()测试:

if (!empty($vFoo) && !empty($vSomeValue) && !empty($vAnother)) {

但是您可能希望将其拆分为三个ifs,因此您可以单独应用额外的文本:

if (!empty($vFoo)) {
   $result .= "<li>$vFoo</li>";
}
if (!empty($vSomeValue)) {
   $result .= "<li>$vSomeValue</li>";
}
if (!empty($vAnother)) {

7
投票

empty()只能接受一个论点。另一方面,isset()可以接受多个;当且仅当设置了所有参数时,它才会返回true。但是,这只会检查它们是否已设置,而不是它们是否为空,所以如果你需要专门排除空字符串,那么你将不得不做kelloti建议的那样做。


6
投票

使用布尔/逻辑运算符:

if (!empty($vFoo) && !empty($vSomeValue) && !empty($vAnother)) {
    $result .= "<li>$vFoo</li>"
    ...
}

此外,您可能希望使用or而不是and加入这些。如您所见,这可以为您提供相当大的灵活性。


3
投票

节省一些打字并将其放入循环...

foreach (array('vFoo','vSomeValue','vAnother') as $varname) {
  if (!empty($$varname)) $result .= '<li>'.$$varname.'</li>';
}

2
投票

我使用此函数作为isset的替代。它比@imkingdavid的更简单,如果所有参数(变量)都不为空,则返回true,或者在第一个空值后返回false。

function isNotEmpty() {
    foreach (func_get_args() as $val) {
        if (empty($val)) {
            return false;
        }
    }

    return true;
}

1
投票

正如其他人所说,empty()只有一个参数,所以你必须使用类似的东西

if(!empty($v1) && !(empty($v2) ...)

但是if (!empty($v))if($v)是一样的,所以你也可以使用:

if ($v1 && $v2 ...)

1
投票

为什么不循环遍历$ item数组

foreach($item as $v) {
    if(!empty($v))) {
        $result .= "<li>$v</li>";
    }
}

您还可以验证密钥索引值

foreach($item as $key => $value) {
    if($key == 'vFoo') {
        if(!empty($value))) {
            $result .= "<li>$value</li>";
        }
    }
    // would add other keys to check here
}

对于empty()与isset()

$zero = array(0, "0");

foreach($zero as $z) {
    echo "\nempty(): $z ";
    var_dump($z);
    var_dump(empty($z)); // Will return true as in it's empty
    echo "isset(): $z ";
    var_dump(isset($z)); // will return true as it has value
}

输出:

empty(): 0 int(0)
bool(true)
isset(): 0 bool(true)

empty(): 0 string(1) "0"
bool(true)
isset(): 0 bool(true)

1
投票

刚刚加入imkingdavid的帖子;

要在任何参数为空时返回TRUE,请查看以下内容。

function mempty(...$arguments)
{
    foreach($arguments as $argument) {
        if(empty($argument)) {
            return true;
        }
    }
    return false;
}

这更接近isset()如何工作,并且如果支持可变长度的参数,我期望empty()如何工作。这也将与empty()的工作原理保持一致,如果一切都不为空,它将返回FALSE


如果提供了多个参数,则只有在设置了所有参数后,isset()才会返回TRUE。评估从左到右进行,一旦遇到未设置的变量就停止。

PHP: isset - Manual

© www.soinside.com 2019 - 2024. All rights reserved.