18

我正在尝试使用if(!empty)PHP 中的函数润色一些代码,但是当它们不是数组时,我不知道如何将其应用于多个变量(正如我之前必须做的那样),所以如果我有:

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

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

4

15 回答 15

38

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

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

旁注:“mempty”中的前导“m”代表“multiple”。你可以随心所欲地称呼它,但这似乎是最短/最简单的命名方式。此外……说起来很有趣。:)

2013 年 10 月 10 日更新:我可能应该补充一点,与 empty() 或 isset() 不同,如果你将一个未定义的变量或不存在的数组索引传递给这个 mempty() 函数,它会叫人血腥谋杀。

于 2011-10-17T19:57:36.287 回答
20

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

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

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

if (!empty($vFoo)) {
   $result .= "<li>$vFoo</li>";
}
if (!empty($vSomeValue)) {
   $result .= "<li>$vSomeValue</li>";
}
if (!empty($vAnother)) {
于 2011-02-14T14:18:23.693 回答
8

empty()只能接受一个论点。isset(),另一方面,可以接受多个;当且仅当设置了所有参数时,它将返回 true。但是,这只检查它们是否已设置,而不是它们是否为空,因此如果您需要专门排除空白字符串,那么您必须按照 kelloti 的建议进行操作。

于 2011-02-14T14:18:31.727 回答
7

使用布尔/逻辑运算符:

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

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

于 2011-02-14T14:15:03.173 回答
4

Just adding to the post by imkingdavid;

To return TRUE if any of the parameters are empty, check out the below instead.

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

This is closer to how isset() works, and is how i would expect empty() to work if supporting a variable length of parameters. This will also keep in line with how empty() works in that it will return FALSE if everything is not empty.


If multiple parameters are supplied then isset() will return TRUE only if all of the parameters are set. Evaluation goes from left to right and stops as soon as an unset variable is encountered.

PHP: isset - Manual

于 2017-07-19T03:06:49.260 回答
4

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

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

    return true;
}
于 2016-06-01T15:58:29.320 回答
3

为自己节省一些输入并将其放入循环中......

foreach (array('vFoo','vSomeValue','vAnother') as $varname) {
  if (!empty($$varname)) $result .= '<li>'.$$varname.'</li>';
}
于 2011-02-14T14:20:17.077 回答
2

正如其他人指出的那样,empty()只需要一个参数,所以你必须使用类似的东西

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

但是 if (!empty($v))与您相同,if($v)因此您也可以使用:

if ($v1 && $v2 ...)
于 2011-02-14T14:22:40.727 回答
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)
于 2011-02-14T14:24:20.570 回答
0

我不是 100% 确定我理解你想要做什么,但这里有几个可能的答案:

只有当它不为空时,这才会返回每个变量:

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>';
}
于 2011-02-14T14:20:10.090 回答
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";

多谢你们!

于 2011-02-15T11:53:44.153 回答
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
}
于 2017-11-16T13:53:12.470 回答
0

如果仅使用strings,您可以尝试以下操作:

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

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

于 2018-03-04T14:58:28.953 回答
0

为什么不只是这样:

foreach(array_filter($input_array) as $key => $value) {
    // do something with $key and $value
}
于 2017-06-13T16:34:42.800 回答
0

你可以试试 php &&/and运算符。他们都是一样的。

if(!empty($vFoo) && !empty($vSomeValue) && !empty($vAnother) {
   $result .= "<li>$vFoo</li>"
   $result .= "<li>$vSomeValue</li>"
   $result .= "<li>$vAnother</li>"
}
于 2021-11-25T05:09:04.137 回答