我正在尝试使用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>"
}
但当然,它不起作用。
答案 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。评估从左到右进行,并在遇到未设置的变量时立即停止。
答案 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 ;吨。