Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Candidat au Club
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    novembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Distribution

    Informations forums :
    Inscription : novembre 2018
    Messages : 4
    Points : 3
    Points
    3

    Par défaut SimpleXML : Condition IF ne fonctionne pas avec une valeur numérique

    Bonjour,

    j'avoue ne pas comprendre.
    Je dois traiter l'XML d'un fournisseur pour utiliser ses données dans divers scripts

    Extrait :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    <cat1 id="15202" name="ACCESSOIRE">
          <cat2 id="20463" name="Electricité / Pile">
            <cat3 id="15995" name="Pile / Chargeur">
              <cat4 id="20468" name="Pile Alcaline"/>
              <cat4 id="20469" name="Pile rechargeable"/>
              <cat4 id="20470" name="Pile bouton"/>
              <cat4 id="20471" name="Chargeur"/>
              <cat4 id="21665" name="Accessoire"/>
            </cat3>
            <cat3 id="20464" name="Bloc d'alimentation">
              <cat4 id="20464" name="Bloc d'alimentation"/>
            </cat3>
            <cat3 id="20465" name="Multiprises / Parasurtenseur">
              <cat4 id="20465" name="Multiprises / Parasurtenseur"/>
            </cat3>
            <cat3 id="20466" name="Rallonge électrique">
              <cat4 id="20466" name="Rallonge électrique"/>
            </cat3>
          </cat2>
          <cat2 id="21746" name="Guide et catalogue">
            <cat3 id="22680" name="Extra">
              <cat4 id="22680" name="Extra"/>
            </cat3>
            <cat3 id="22681" name="ProxiConfort">
              <cat4 id="22681" name="ProxiConfort"/>
            </cat3>
            <cat3 id="22682" name="BlancBrun">
              <cat4 id="22682" name="BlancBrun"/>
            </cat3>
            <cat3 id="22683" name="Domial">
              <cat4 id="22683" name="Domial"/>
            </cat3>
            <cat3 id="22684" name="Neutre">
              <cat4 id="22684" name="Neutre"/>
            </cat3>
          </cat2>
          <cat2 id="21817" name="Prestations et produits non classés (ne pas modifi">
            <cat3 id="21818" name="Prestations">
              <cat4 id="21818" name="Prestations"/>
            </cat3>
            <cat3 id="21819" name="Produits non classés">
              <cat4 id="21819" name="Produits non classés"/>
            </cat3>
            <cat3 id="21827" name="Garanties">
              <cat4 id="21827" name="Garanties"/>
            </cat3>
          </cat2>
          <cat2 id="21845" name="Affichage">
            <cat3 id="21846" name="Tableau ardoise lumineux">
              <cat4 id="21846" name="Tableau ardoise lumineux"/>
            </cat3>
          </cat2>
          <cat2 id="22687" name="Mobilier">
            <cat3 id="22687" name="Mobilier">
              <cat4 id="22687" name="Mobilier"/>
            </cat3>
          </cat2>
        </cat1>

    Ce fichier semble mal construit mais je ne peux pas imposer des changements au fournisseur.
    Il contient de multiples valeurs en double, voire en triple.

    Du coup, dans mes boucles de traitement, je mets des conditions ($cat2_id) sur l'ID des catégories pour comparer avec $cat1_id.
    Ensuite, je réitère avec $cat3_id vs $cat2_id et $cat4_id vs $cat3_id dans mes boucles internes.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    while (isset($xml->catalogue[0]->cat1[$count1]->cat2[$count2])) {
     
    		$cat2_id = $xml->catalogue[0]->cat1[$count1]->children()->cat2[$count2]['id'];
    		$cat2_name = ucfirst(strtolower($xml->catalogue[0]->cat1[$count1]->children()->cat2[$count2]['name']));
     
    		if ($cat2_id <> $cat1_id) {
     
    				echo '<h4><span style="margin-left:50px;display:inline-block">>>&nbsp;'.$cat2_id.'&nbsp;:&nbsp;'.$cat2_name;
    				$norm = $cat1_name."::1::1::1/".$cat2_name."::1::1::1";
    				echo '&nbsp;'.$norm.'</span></h4><br>';
     
    				$read = Read($cat1_id,$mysqli);
    				$path = $read."::1::1::1/";
     
    				$read = Read($cat2_id,$mysqli);
    				$path .= $read."::1::1::1";
     
    				//echo $path;exit();
    				$write = Write($cat2_id,$path,$mysqli);
    		}

    Dans ce cas , la condition n'est pas prise en compte et toutes les sous-cat sont affichées (doublons, triplons : cf. cat 22687)
    En revanche, si je teste $cat2_name, cela fonctionne.

    Ce n'est pas grave en soit mais après un long moment passé sur cette anomalie, j'aimerais comprendre .

    Merci pour votre aide.

  2. #2
    Membre émérite Avatar de CosmoKnacki
    Homme Profil pro
    Inscrit en
    mars 2009
    Messages
    1 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 1 366
    Points : 2 614
    Points
    2 614

    Par défaut

    $cat2_id et fort probablement $cat1_id sont des instances de SimpleXMLElement. Lorsque tu les compares avec $cat2_id <> $cat1_id, il n'y a pas eu de transtypage puisque les deux opérandes sont des objets, et comme les deux objets sont différents, cette comparaison demeure vraie quelque soient les valeurs des attributs id.

    En revanche, lorsque tu fais la même comparaison avec $catx_name, tu compares simplement des chaînes de caractères, car le transtypage vers le type string a déjà eu lieu dés lors que tu as appliqué la fonction strtolower à l'objet $xml->catalogue[0]->cat1[$count1]->children()->cat2[$count2]['name'].

    Donc en fait pour que ça marche, il suffit de faire la comparaison (string)$cat2_id <> (string)$cat1_id ou de transtyper ces deux variables en string au préalable.

    NB: bien que l'opérateur <> existe en PHP, on utilise plus couramment l'opérateur !=.
    3615 JEXISTE

  3. #3
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 263
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 263
    Points : 2 221
    Points
    2 221

    Par défaut

    Dans ce cas , la condition n'est pas prise en compte et toutes les sous-cat sont affichées (doublons, triplons : cf. cat 22687)
    En revanche, si je teste $cat2_name, cela fonctionne.
    Je ne vois pas comment
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
        if ($cat2_id <> $cat1_id) {
    et
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
        if ($cat2_name <> $cat1_name) {
    pourraient se comporter différemment pour le fragment de xml montré. Non ?

  4. #4
    Candidat au Club
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    novembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Distribution

    Informations forums :
    Inscription : novembre 2018
    Messages : 4
    Points : 3
    Points
    3

    Par défaut

    Citation Envoyé par CosmoKnacki Voir le message
    $cat2_id et fort probablement $cat1_id sont des instances de SimpleXMLElement. Lorsque tu les compares avec $cat2_id <> $cat1_id, il n'y a pas eu de transtypage puisque les deux opérandes sont des objets, et comme les deux objets sont différents, cette comparaison demeure vraie quelque soient les valeurs des attributs id.

    En revanche, lorsque tu fais la même comparaison avec $catx_name, tu compares simplement des chaînes de caractères, car le transtypage vers le type string a déjà eu lieu dés lors que tu as appliqué la fonction strtolower à l'objet $xml->catalogue[0]->cat1[$count1]->children()->cat2[$count2]['name'].

    Donc en fait pour que ça marche, il suffit de faire la comparaison (string)$cat2_id <> (string)$cat1_id ou de transtyper ces deux variables en string au préalable.

    NB: bien que l'opérateur <> existe en PHP, on utilise plus couramment l'opérateur !=.
    Merci CosmoKnacki,

    je ne connaissais pas cette notion de transtypage. Je vais donc me documenter.
    Car en l’occurrence, c'était bien l'origine du dysfonctionnement.

    Merci à toi

  5. #5
    Candidat au Club
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    novembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Distribution

    Informations forums :
    Inscription : novembre 2018
    Messages : 4
    Points : 3
    Points
    3

    Par défaut

    Citation Envoyé par CosmoKnacki Voir le message

    NB: bien que l'opérateur <> existe en PHP, on utilise plus couramment l'opérateur !=.
    Oui j'avais au début utilisé != . Mais remplacer par <> était une de mes pistes d'investigation. Je pensais que cela pouvait avoir une incidence sur le résultat de la condition

  6. #6
    Membre émérite Avatar de CosmoKnacki
    Homme Profil pro
    Inscrit en
    mars 2009
    Messages
    1 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 1 366
    Points : 2 614
    Points
    2 614

    Par défaut

    Oui, PHP est un langage à typage faible, ce qui veut dire concrètement qu'il se débrouille comme il peut quand on effectue une opération ou une comparaison avec des types différents, ou encore lorsqu'on applique une fonction sur un type qui n'est pas attendu. Donc la plus part du temps transtyper (ou "caster" de l'anglais type casting) soi-même est inutile, mais il faut être vigilent:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var_dump(1 + "2"); // int(3)
    var_dump(1 . "2"); // string(2) "12"
    var_dump(1 < "2"); // bool(true)
     
    var_dump(010 < 10); // bool(true) # 010 la notation octale de 8
    var_dump("010" < 10); // bool(false) # mais le transtypage de string à int ignore le 0 et le convertit en 10
    3615 JEXISTE

  7. #7
    Candidat au Club
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    novembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Distribution

    Informations forums :
    Inscription : novembre 2018
    Messages : 4
    Points : 3
    Points
    3

    Par défaut

    Citation Envoyé par CosmoKnacki Voir le message
    Oui, PHP est un langage à typage faible, ce qui veut dire concrètement qu'il se débrouille comme il peut quand on effectue une opération ou une comparaison avec des types différents, ou encore lorsqu'on applique une fonction sur un type qui n'est pas attendu. Donc la plus part du temps transtyper (ou "caster" de l'anglais type casting) soi-même est inutile, mais il faut être vigilent:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var_dump(1 + "2"); // int(3)
    var_dump(1 . "2"); // string(2) "12"
    var_dump(1 < "2"); // bool(true)
     
    var_dump(010 < 10); // bool(true) # 010 la notation octale de 8
    var_dump("010" < 10); // bool(false) # mais le transtypage de string à int ignore le 0 et le convertit en 10
    Merci beaucoup pour ce complément d'info.
    Je comprends mieux maintenant.
    Je code en PHP depuis des années sans savoir que - sans le savoir - je transtypais en variable en mettant des quotes.
    J'ai notamment lu hier ceci : http://php.net/manual/fr/language.ty...e-juggling.php

    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/01/2009, 17h47
  2. LIKE qui ne fonctionne pas avec une espace
    Par CinePhil dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/10/2008, 17h46
  3. un For Each qui ne fonctionne pas avec une collection maison !
    Par grenouillesiverte dans le forum Windows Forms
    Réponses: 7
    Dernier message: 01/09/2007, 22h00
  4. Réponses: 4
    Dernier message: 15/03/2007, 21h32
  5. Réponses: 7
    Dernier message: 24/01/2006, 12h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo