Использование if(! Empty) с несколькими переменными вне массива

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

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

15 ответов

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

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

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

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

Вам нужно написать цепочку условий. использование && проверить несколько переменных, каждая из которых имеет свои 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)) {

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

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

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

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

Просто добавляю в пост imkingdavid;

Возвращать TRUE если какой-либо из параметров является пустым, проверьте ниже.

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

Это ближе к тому, как isset() работает, и как я ожидал empty() работать, если поддерживает переменную длину параметров. Это также будет соответствовать тому, как empty() работает в том, что он вернется FALSE если все не пусто.


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

PHP: isset - Руководство

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

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

    return true;
}

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

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

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

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

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

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

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

Почему бы просто не так:

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

Ребята, большое спасибо за все ваши ответы, я вроде создал сценарий, основанный на всех наших возможных ответах, который на самом деле помогает мне в изучении синтаксиса 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";

Спасибо, парни!

Просто для записи: 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
}

Я не уверен на 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>';
}

можно попробовать пхп &&/ andоператор. Они оба одинаковы.

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

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

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

Обратите внимание, что empty(0) будет возвращать true, тогда как empty('0'.'0') и empty('0') не будут.

Другие вопросы по тегам