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

时间:2011-02-14 14:09:06

标签: php is-empty

我正在尝试使用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>"
}

但当然,它不起作用。

14 个答案:

答案 0 :(得分: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()函数将会发出血腥的谋杀案 - 存在的数组索引。

答案 1 :(得分: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)) {

答案 2 :(得分:7)

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

答案 3 :(得分:6)

使用布尔/逻辑运算符:

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

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

答案 4 :(得分:3)

为自己保存一些打字并将其放入循环中......

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

答案 5 :(得分:2)

正如其他人所说,empty()只需要一个参数,所以你必须使用像

这样的东西
if(!empty($v1) && !(empty($v2) ...)

,但 if (!empty($v))if($v)相同,所以您也可以使用:

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

答案 6 :(得分:2)

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

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

    return true;
}

答案 7 :(得分: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)

答案 8 :(得分: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

答案 9 :(得分: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>';
}

答案 10 :(得分:0)

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

$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";

谢谢你们!

答案 11 :(得分:0)

为什么不这样:

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

答案 12 :(得分: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
}

答案 13 :(得分:0)

如果仅使用字符串,您可以尝试以下操作:

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

注意,空(0)将返回true,而空(&#39; 0&#39;。&#39; 0&#39;)和空(&#39; 0&#39;)将赢得&#39 ;吨。