Использование if (! Empty) с несколькими переменными вне массива - PullRequest
16 голосов
/ 14 февраля 2011

Я пытаюсь отшлифовать некоторый код с помощью функции 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>"
}

Но, конечно, это не работает.

Ответы [ 14 ]

33 голосов
/ 17 октября 2011

Вы можете создать новую функцию-оболочку, которая принимает несколько аргументов и передает каждый из них через empty (). Он будет работать аналогично isset (), возвращая true, только если все аргументы пусты, и возвращая false, когда достигнет первого непустого аргумента. Вот то, что я придумал, и это сработало в моих тестах.

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

Примечание: «m» в начале слова «m» означает «множественный». Вы можете называть это как хотите, но это казалось самым коротким / простым способом назвать это. Кроме того ... это интересно сказать. :)

Обновление 10/10/13: Я, вероятно, должен добавить, что в отличие от empty () или isset (), эта функция mempty () будет плакать кровавым убийством, если вы передадите ей неопределенную переменную или не индекс существующего массива.

18 голосов
/ 14 февраля 2011

Вам нужно написать цепочку условий. Используйте && для проверки нескольких переменных, каждая из которых имеет свой собственный empty() test:

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)) {
7 голосов
/ 14 февраля 2011

empty() может принимать только один аргумент. isset(), с другой стороны, может принимать несколько; он вернет истину тогда и только тогда, когда установлены все аргументы. Однако это проверяет только, установлены ли они, а не пустые, поэтому, если вам нужно специально исключить пустые строки, вам придется делать то, что предлагает kelloti.

6 голосов
/ 14 февраля 2011

используйте логические / логические операторы:

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

Также вы можете присоединиться к ним с or вместо and.Как видите, это может дать вам немного гибкости.

3 голосов
/ 14 февраля 2011

Спасите себя от набора текста и поместите его в цикл ...

foreach (array('vFoo','vSomeValue','vAnother') as $varname) {
  if (!empty($$varname)) $result .= '<li>'.$$varname.'</li>';
}
2 голосов
/ 01 июня 2016

Я использую эту функцию как альтернативу isset. Это немного проще, чем у @ imkingdavid, и возвращает true, если все аргументы (переменные) не пусты или возвращают false после первого пустого значения.

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

    return true;
}
2 голосов
/ 14 февраля 2011

Как уже отмечалось, empty() принимает только один аргумент, поэтому вы должны использовать что-то вроде

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

, но if (!empty($v)) - это то же самое, что и if($v), поэтому вытакже можно использовать:

if ($v1 && $v2 ...)
1 голос
/ 19 июля 2017

Просто добавьте к сообщению imkingdavid ;

Чтобы вернуть TRUE, если какой-либо из параметров пуст, проверьте нижеприведенное.* Это ближе к тому, как работает isset(), и как я ожидал бы, что empty() будет работать, если будет поддерживать переменную длину параметров.Это также будет соответствовать тому, как работает empty(), и будет возвращать FALSE, если все не пусто.


Если задано несколько параметров, то isset () вернет TRUE, только если все параметры установлены.Оценка идет слева направо и останавливается, как только встречается неустановленная переменная.

PHP: isset - Manual

1 голос
/ 14 февраля 2011

Почему бы просто не перебрать массив $ 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
}

Для пустых () и 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)
0 голосов
/ 04 марта 2018

Если вы работаете только с строками , вы можете попробовать следующее:

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

Обратите внимание, что empty (0) вернет true, а пустой ('0'. '0') и пусто (' 0 ') не будет.

...