it-swarm-ru.tech

Использование 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>"
}

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

13
HGB

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

31
imkingdavid

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

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

7
Andrew

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

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

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

5
kelloti

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

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

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

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

    return true;
}
2
hovado

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

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

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

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


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

PHP: isset - Вручную

1
Dylan

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

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

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

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

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

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

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

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

0
lenny

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

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

0
HGB

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

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

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

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