web-dev-qa-db-ja.com

配列にない複数の変数でif(!empty)を使用する

PHP=のif(!empty)関数を使用してコードを洗練しようとしていますが、配列ではないときに複数の変数にこれを適用する方法がわかりません。以前に行うため)私が持っている場合:

$vFoo       = $item[1]; 
$vSomeValue = $item[2]; 
$vAnother   = $item[3];

次に、値がある場合にのみ結果を印刷します。これは1つの変数に対して機能するため、次のことができます。

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

私は線に沿って何かを試しました

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

しかし、もちろん機能しません。

16
HGB

複数の引数を受け入れ、それぞれをempty()に渡す新しいラッパー関数を作成できます。 isset()と同様に機能し、すべての引数が空の場合にのみtrueを返し、最初の空でない引数に到達したときにfalseを返します。ここに私が思いついたものがあり、それは私のテストでうまくいきました。

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

サイドノート:「mempty」の先頭の「m」は「multiple」を表します。好きな名前を付けることができますが、名前を付ける最も簡単で簡単な方法のように思えました。それに...と言って楽しいです。 :)

10/10/13更新:おそらくempty()やisset()とは異なり、未定義の変数または存在しない配列を渡すと、このmempty()関数は血まみれの殺人者を泣かせることを追加する必要がありますインデックス。

33
imkingdavid

条件チェーンを作成する必要があります。 _&&_を使用して、それぞれ独自のempty()テストで複数の変数をテストします。

_if (!empty($vFoo) && !empty($vSomeValue) && !empty($vAnother)) {
_

ただし、おそらく3つのifに分割する必要があるため、追加のテキストを個別に適用できます。

_if (!empty($vFoo)) {
   $result .= "<li>$vFoo</li>";
}
if (!empty($vSomeValue)) {
   $result .= "<li>$vSomeValue</li>";
}
if (!empty($vAnother)) {
_
18
mario

empty()は1つの引数のみを受け入れることができます。一方、isset()は複数を受け入れることができます。すべての引数が設定されている場合にのみtrueを返します。ただし、空であるかどうかではなく、設定されているかどうかだけがチェックされるため、空の文字列を明確に除外する必要がある場合は、kellotiが提案することを行う必要があります。

7
Andrew

ブール演算子/論理演算子を使用します。

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

また、これらをorではなくandで結合することもできます。ご覧のとおり、これによりかなりの柔軟性が得られます。

6
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

他の人が指摘したように、empty()は引数を1つだけ取るため、次のようなものを使用する必要があります。

_if(!empty($v1) && !(empty($v2) ...)
_

butif (!empty($v))if($v)と同じものなので、以下も使用できます。

_if ($v1 && $v2 ...)
_
2
Eelvex

imkingdavid ;で投稿に追加するだけです。

パラメータのいずれかが空の場合にTRUEを返すには、代わりに以下をチェックしてください。

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

これはisset()の動作に近く、可変長のパラメーターをサポートする場合にempty()が動作することを期待する方法です。また、すべてがnotの場合、FALSEを返すという点で、empty()の動作と一致します。空の。


複数のパラメーターが指定されている場合、isset()はすべてのパラメーターが設定されている場合にのみTRUEを返します。評価は左から右に進み、未設定の変数が検出されるとすぐに停止します。

PHP:isset-Manual

1
Dylan

なぜ$ 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)
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);

または、どれも空でない場合、3つすべてを追加します。

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