Bonsoir,
confronté à un problème dans un script, c'est l'incompréhension face à une abbération qui a suivie.

J'utilise un foreach et je souhaite appliquer un traitement différent à la valeur correspondante à la clé 0, par le biais d'une simple expression conditionnelle.

En toute logique et en résumé j'écris donc :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
foreach($variable AS $cle => $valeur) {
      if($cle == 0) { ... }
      ...
}
Malgré la simplicité du code, de toutes évidences ça ne marchait pas : et pour cause, pour lui chaque clé était égale à 0 !

J'ai donc étudié cette abbération par ces lignes de test sur les strings :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
if('coucou' == 1)
    echo 'ok pour 1'."\n";
if('coucou' == 0)
    echo 'ok pour 0'."\n";
 
if('coucou' == true)
    echo 'ok pour true'."\n";
if('coucou' == false)
    echo 'ok pour false'."\n";
Ce qui affiche :
ok pour 0
ok pour true
Un string, quel qu'il soit, est donc toujours égal à la valeur 0.
Mais comme un string est évidemment qqch de toujours vrai, il est aussi égal à la valeur true.
Mais il n'est pas par défaut égal à 1.

Sachant que 0 correspond à false et 1 à true, pourquoi et comment un string peut-il être par défaut considéré à la fois égal à 0 et à true ?

Pour compléter le test j'ai ensuite ajouté ces lignes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
if('coucou' === 1)
    echo 'ok pour 1 en strict'."\n";
if('coucou' === 0)
    echo 'ok pour 0 en strict'."\n";
qui, elles, n'affichent rien.

Il existe donc une différence entre le zéro décimal et le zéro booléen, soit.

Ma question, si je la résume est donc : pourquoi PHP considére-t-il toutes chaines comme égale à 0, ce qui ne peut absolument pas s'expliquer par sa booléanité ?
La ligne "if($var == 0)" est donc une abbération ?

Merci d'avance pour vos réponses,
ça me tracasse ^^