web-dev-qa-db-fra.com

Utilisation de if (! Empty) avec plusieurs variables ne figurant pas dans un tableau

J'essaie de peaufiner du code avec la fonction if(!empty) dans PHP, mais je ne sais pas comment appliquer cela à plusieurs variables lorsqu'elles ne sont pas un tableau (comme je devais le faire auparavant), donc si j'ai:

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

Ensuite, je veux imprimer le résultat uniquement s'il existe une valeur. Cela fonctionne pour une variable donc vous avez:

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

J'ai essayé quelque chose dans le sens de 

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

Mais bien sûr, ça ne marche pas.

13
HGB

Vous pouvez créer une nouvelle fonction wrapper qui accepte plusieurs arguments et les transmet à chacun par empty (). Cela fonctionnerait de la même façon que isset (), renvoyant true uniquement si tous les arguments étaient vides et renvoyant false lorsqu'il atteindrait le premier argument non vide. Voici ce que je suis venu avec, et cela a fonctionné dans mes tests.

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

Note latérale: Le "m" initial dans "mempty" signifie "multiple". Vous pouvez l'appeler comme vous voulez, mais cela semblait être le moyen le plus court/le plus simple de le nommer. En plus ... c'est amusant à dire. :)

Mise à jour 10/10/13: Je devrais probablement ajouter que, contrairement à empty () ou isset (), cette fonction mempty () lancera un meurtre sanglant si vous lui transmettez une variable non définie ou un index de tableau inexistant.

31
imkingdavid

Vous devez écrire une chaîne de conditions. Utilisez && pour tester plusieurs variables, chacune avec son propre test empty():

if (!empty($vFoo) && !empty($vSomeValue) && !empty($vAnother)) {

Mais vous voudrez probablement le scinder en trois ifs pour pouvoir appliquer le texte supplémentaire individuellement:

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

empty() ne peut accepter qu'un seul argument. isset(), d'autre part, peut accepter plusieurs; il retournera true si et seulement si tous les arguments sont définis. Cependant, cela ne fait que vérifier si elles sont définies, pas si elles sont vides. Par conséquent, si vous devez exclure spécifiquement les chaînes vides, vous devrez suivre les recommandations de kelloti.

7
Andrew

utiliser des opérateurs booléens/logiques:

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

En outre, vous voudrez peut-être les rejoindre avec or au lieu de and. Comme vous pouvez le constater, cela peut vous donner un peu de flexibilité.

5
kelloti

Epargnez-vous un peu en tapant et mettez-le en boucle ...

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

J'utilise cette fonction comme alternative à isset. C'est un peu plus simple que celui de @ imkingdavid et renvoie true si tous les arguments (variables) ne sont pas vides, ou renvoie false après la première valeur vide.

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

    return true;
}
2
hovado

Il suffit d’ajouter au message de imkingdavid ;

Pour renvoyer TRUE si l'un des paramètres est vide, jetez un coup d'œil à ci-dessous.

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

C’est plus proche de la façon dont fonctionne isset() et c’est ainsi que je m'attendrais à ce que empty() fonctionne s’il prend en charge une longueur variable de paramètres. Cela restera également en phase avec le fonctionnement de empty() en ce sens qu'il retournera FALSE si tout est non vide.


Si plusieurs paramètres sont fournis, alors isset () ne renverra TRUE que si tous les paramètres sont définis. L'évaluation va de gauche à droite et s'arrête dès qu'une variable non définie est rencontrée.

PHP: isset - Manuel

1
Dylan

Comme d'autres l'ont noté, empty() ne prend qu'un argument, vous devez donc utiliser quelque chose comme

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

mais if (!empty($v)) est la même chose que if($v), vous pouvez donc également utiliser:

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

Pourquoi ne pas simplement parcourir le tableau $ item

foreach($item as $v) {
    if(!empty($v))) {
        $result .= "<li>$v</li>";
    }
}

Vous pouvez également valider la valeur de l'index de clé

foreach($item as $key => $value) {
    if($key == 'vFoo') {
        if(!empty($value))) {
            $result .= "<li>$value</li>";
        }
    }
    // would add other keys to check here
}

Pour le empty () versus 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
}

Sortie:

empty(): 0 int(0)
bool(true)
isset(): 0 bool(true)

empty(): 0 string(1) "0"
bool(true)
isset(): 0 bool(true)
1
Phill Pafford

Si vous travaillez uniquement avec strings , vous pouvez essayer les solutions suivantes:

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

Notez que vide (0) renverrait vrai, alors que vide ('0'. '0') et vide ('0') ne le sera pas. 

0
lenny

Les gars, merci beaucoup pour toutes vos réponses, j'ai en quelque sorte créé un script basé sur toutes nos réponses possibles, ce qui m'aide réellement à apprendre la syntaxe de PHP, ce qui est à l'origine de la plupart de mes erreurs :) Alors voila

$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";
}

Je dois juste trouver comment rendre certaines de ces choses différentes maintenant. Donc, pourrais-je accéder à chacun de la manière suivante?

$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";

Merci les gars!

0
HGB

Pour mémoire: array_reduce fonctionne également.

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

Je ne suis pas sûr à 100% de comprendre ce que vous essayez de faire, mais voici quelques réponses possibles:

Cela retournera chaque variable seulement si elle n'est pas vide:

function printIfNotEmpty($var) {
  if (!empty($var)) {
    return '<li>' . $var . '</var>';
  }
  return '';
}
$result .= printIfNotEmpty($vFoo);
$result .= printIfNotEmpty($vSomeValue);
$result .= printIfNotEmpty($vAnother);

Ou celui-ci les ajoutera tous les trois si aucun n'est vide:

if (!empty($vFoo) && !empty($vSomeValue) && !empty($vAnother)) {
  $result .= '<li>' . $vFoo . '</li>';
  $result .= '<li>' . $vSomeValue . '</li>';
  $result .= '<li>' . $vAnother . '</li>';
}
0
Nathan MacInnes

Pourquoi pas comme ça:

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