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.
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.
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)) {
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.
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é.
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>';
}
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;
}
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.
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 ...)
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)
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.
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!
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
}
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>';
}
Pourquoi pas comme ça:
foreach(array_filter($input_array) as $key => $value) {
// do something with $key and $value
}