Test IF

Mammouth du PHP | 985 Messages

19 mars 2010, 19:07

Pour une fonction qui renvoie un tableau ou false.

Si je veux la tester avec un if.
Exemple:
<?php
$var = array('a', 'b');
$var2 = array(); // tableau vide
$var3 = false;

echo ($var) ? 'Oui' : 'Non'; // retourne Oui 
var_dump($var); // Retourne: array('a', 'b')

echo ($var2) ? 'Oui' : 'Non'; // retourne Non - > (false)
var_dump($var2); // Retourne: array()

echo ($var3) ? 'Oui' : 'Non'; // retourne Non - > (false)
var_dump($var3); // Retourne: false
?>
Le soucis ici c'est que $var ne renvoie jamais true alors que je fais un test boolean.

Est-ce un soucis ou est-il encore plus propre de faire ceci?
<?php
$var = array('a', 'b');
$var2 = array(); // tableau vide
$var3 = false;

echo ((bool)$var) ? 'Oui' : 'Non';

echo ((bool)$var2) ? 'Oui' : 'Non';

echo ((bool)$var3) ? 'Oui' : 'Non';
?>
Concrètement, le if($var), permettrait non seulement de s'assurer que $var ne renvoie pas false mais aussi qu'il contient bien un tableau et aussi qu'il n'est pas vide.

A la différence d'un or quelquechose qui ne vérifie que si la variable ne renvoie pas false...

exemple:
<?php
$resultat = mysql_fetch_assoc($query);

if ((bool)$resultat) {
     echo $resultat[0];
}
?>
Ce n'est peut -être pas le bon exemple, on pourrait répondre que la fonction mysql_fetch_assoc() n'est pas censée retourner un tableau vide, mais admettons que oui...
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 1136 Messages

19 mars 2010, 19:15

Slt ,

sauf erreur de ma part , normalement mysql_fetch_assoc() , renvoi soit un tableau , soit false ,

ton test peu donc se faire comme ceci :
$resultat = mysql_fetch_assoc($query);

if ( is_array($resultat) ) {
     echo $resultat[0];
}
Si ce n'est pas un tableau , c'est donc forcément False !

Ch.

Edit , ha en admettant qu'il retourne un tab vide .. dans ce cas , une seconde vérif suffit ,
$resultat = mysql_fetch_assoc($query);

if ( is_array($resultat)  ) {
     if( count( $result ) > 0 ){
         echo $resultat[0];
    }
}

Mammouth du PHP | 985 Messages

19 mars 2010, 19:23

Oui en effet depuis quelques temps, j'utilise is_array(), mais ma question n'est pas celle-ci.

C'est sur un test if: si la $var peut contenir un tableau ou false.
Et dans ce cas, n'est il pas plus propre de caster $var en (bool) car c'est un test boolean.
Ou cela n'a aucune incidence pour PHP?
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 1136 Messages

19 mars 2010, 19:36

Pour moi ,

si une variable peut avoir un booléen ou un tableau , j'utiliserais is_array() qui est fait pour savoir si c'est effectivement un tableau .

Maintenant , caster le tableau est valide et ne pose aucun problème , mais je préfère quand même rester sur le is_array() ( sauf si tu souhaites tester les tableaux vides en une seule ligne alors là oui ta méthode est plus pratique ) pour la relecture future du code , un tableau doit être tester comme tableau , car c'est le type que j'attend , et non l'inverse .

Ch.

Mammouth du PHP | 985 Messages

19 mars 2010, 19:42

Ok merci ca répond à une partie de ma question.

Maintenant, d'une façon plus générale.
Si on fait un test boolean sur une variable qui ne retourne pas true et false mais false et un autre type.

Cela est-il plus propre dans ce cas pour notre test boolean de caster cette variable en (bool) durant le test?

Ou aucune importance ou incidence pour PHP?
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 1136 Messages

19 mars 2010, 19:47

Encore une fois ,

j'ai toujours suivi ce principe :

ma variable doit être un entier , pour tester ma variable , je regarde si c'est bien un entier , sinon , elle n'es pas valide
ma variable doit être un tableau , pour tester ma variable , je regarde si c'est bien un tableau , sinon , elle n'es pas valide
ma variable doit être un float , pour tester ma variable , je regarde si c'est bien un float , sinon , elle n'es pas valide

En suivant ce principe , tu es toujours certains du type avec lequel tu travails , alors que si tu regardes si ton entier est un boolèen à false , ou pas , alors si le test passe , tu pourras tres bien au final te retrouver avec un tableau ou un float ou ... bref l'incertitude persiste :)

Maintenant , oui caster fonctionne bien , mais derrière tu ne sais pas forcement ce qui se cache .

C'est mon conseil , peut être d'autres irons dans un autre sens .. mais j'ai des doutes .

Ch.

Mammouth du PHP | 985 Messages

19 mars 2010, 19:53

Dac je comprends ce que tu veux dire.

Et en effet, is_array() est top a utiliser :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Mammouth du PHP | 985 Messages

19 mars 2010, 20:21

En effet c'est complètement incorrect mon truc :mrgreen:

On est en effet plus certain de ce qui se cache derrière, au pire on pourrait faire ensuite un is_array(), mais dans ce cas le if ne sert plus a rien...

Le mieux alors serait un is_array() et ensuite un test empty()...

Parfois on cherche a optimiser et c'est tout le contraire au final, tu as bien fais de me remettre sur la voie :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 1136 Messages

19 mars 2010, 20:25

C'est en forgeant que l'on devient forgeron ... :-)

Bonne continuation

Ch.