IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Langage PHP Discussion :

Incompréhension du résultat fonction intval


Sujet :

Langage PHP

  1. #1
    Membre à l'essai Avatar de liquid_stone
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 18
    Points : 10
    Points
    10
    Par défaut Incompréhension du résultat fonction intval
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    $expression="1*2";
    var_dump(intval($expression));
    ?>
    me donne int 1

    La doc ne m'éclaire pas.
    Si quelqu'un peut m'expliquer...
    Merci
    Et souvenons-nous que le bug est le plus souvent, mais pas toujours, situé entre la chaise et l'écran ;-)

  2. #2
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Salut,
    https://www.php.net/manual/fr/langua...ic-strings.php , Le point 2 explique pourquoi vous avez 1 comme résultat.
    Malheureusement cette partie de la doc n'est pas en français, il faut aussi comprendre l'expression régulière des chaînes numériques. Donc il ne faut pas être étonné d'avoir 2 comme résultat avec intval("2 ans").
    Si le résultat attendu était 6 ce n'est pas comme ça qu'il faut s'y prendre
    Le bienfait n'est jamais perdu

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 090
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 090
    Points : 8 188
    Points
    8 188
    Billets dans le blog
    17
    Par défaut
    Tu demandes de convertir une variable de type chaîne en variable de type entier
    Pour cela PHP récupère les premiers chiffres de la chaine
    Avec intval('5678/0') tu aurais obtenu 5678
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  4. #4
    Membre à l'essai Avatar de liquid_stone
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Bonjour, merci à vous deux,

    Willy_k : j'attendais 2. En effet, il va falloir faire autrement...

    Seb, je comprends, mais comme * est un opérateur et que le tout formait un calcul, je pensais que ça allait de soi pour php, mais apparemment non...
    Et souvenons-nous que le bug est le plus souvent, mais pas toujours, situé entre la chaise et l'écran ;-)

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 090
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 090
    Points : 8 188
    Points
    8 188
    Billets dans le blog
    17
    Par défaut
    Tu ne demandes pas d'évaluer une expression mathématique mais de transtyper une valeur/variable
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  6. #6
    Membre à l'essai Avatar de liquid_stone
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    j'avoue que "transtyper une valeur/variable" n'est pas très clair pour moi

    j'aimerais bien l'évaluer quand même, cette $expression

    je vais chercher du côté de la fonction eval() peut-être
    Et souvenons-nous que le bug est le plus souvent, mais pas toujours, situé entre la chaise et l'écran ;-)

  7. #7
    Membre à l'essai Avatar de liquid_stone
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    J'ai trouvé quelquechose sur stack :

    Code : 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
    <?php
     
     
    $ma = "1*2";
     
    if(preg_match('/(\d+)(?:\s*)([\+\-\*\/])(?:\s*)(\d+)/', $ma, $matches) !== FALSE){
        $operator = $matches[2];
     
        switch($operator){
            case '+':
                $p = $matches[1] + $matches[3];
                break;
            case '-':
                $p = $matches[1] - $matches[3];
                break;
            case '*':
                $p = $matches[1] * $matches[3];
                break;
            case '/':
                $p = $matches[1] / $matches[3];
                break;
        }
     
        echo $p;
    }
    ?>
    Et souvenons-nous que le bug est le plus souvent, mais pas toujours, situé entre la chaise et l'écran ;-)

  8. #8
    Membre à l'essai Avatar de liquid_stone
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Ou cet étonnant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
     
    		$ma ="print (1*2);"; eval($ma);
     
    ?>
    qui fonctionne, mais je ne comprends pas pourquoi non plus

    je vais fouiller

    merci en tout cas
    Et souvenons-nous que le bug est le plus souvent, mais pas toujours, situé entre la chaise et l'écran ;-)

  9. #9
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 090
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 090
    Points : 8 188
    Points
    8 188
    Billets dans le blog
    17
    Par défaut
    Voilà, ce sont les deux méthodes existantes :
    1. Création d'un analyseur
    2. Utilisation de eval()

    La 3e methode pourrait consister à essayer de se passer d'avoir ce genre de choses à faire
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  10. #10
    Membre à l'essai Avatar de liquid_stone
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    J'entends bien mon cher Séb, mais quand on est un indécrassable béotien avec des grosses pattes comme moi, on rampe aussi bien dans le code que dans l'algorithme. Et dans les maths aussi d'ailleurs, puisqu'au départ je me suis retrouvé confronté à un problème de maths, une sorte de suite mathématique fractale dont je n'ai pas les connaissances suffisantes pour la résoudre en une formule.
    Ceci dit, tu vois en t'en parlant, je me suis que j'aurais peut etre dû commencer par balancer la suite dans google.
    Pas mal ça, je vais faire ça.
    Merci de ton aide

    Sinon j'ai trouvé un analyseur, une classe qui a résolu mon problème, en effet.
    Ça m'embêtait de ne pas pouvoir stocker les résultats.

    Mais je trouve quand même étonnant que les fonctions d'affichage fasse du transtypage puisqu'elles évaluent, et qu'on ne puisse pas en profiter. Ou alors on peut en profiter mais je ne sais pas comment faire.
    Et souvenons-nous que le bug est le plus souvent, mais pas toujours, situé entre la chaise et l'écran ;-)

  11. #11
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 090
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 090
    Points : 8 188
    Points
    8 188
    Billets dans le blog
    17
    Par défaut
    Mais on est bien d'accord que ta formule est forcément dans une chaîne ?

    Plus haut tu disais ne pas comprendre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ma ="print (1*2);"; eval($ma);
    Ceci revient en fait à :

    et là on manipule bien des numériques, pas de soucis.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  12. #12
    Membre à l'essai Avatar de liquid_stone
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Certes Séb, mais je trouve quand même ça ambigu.

    Echo ou print sont censées afficher, pas calculer. Afficher 1*2 et pas 2. Afficher un calcul devient ici afficher un résultat de calcul et pas afficher un calcul. On ne peut pas exactement dire que 1*2 soit un nombre.

    Et ça veut dire aussi que print et echo reconnaissent une string mathématique en tant que telle, et que la fonction affichage aurait donc, elle, recours a un analyseur inclus dans le php...

    P.S : j'ai découvert que ma formule mathématique relevait de ce qui s'appelle un parcours d'arbre... " un concept fondamental en algorithmique" selon wikipedia... quelle chose étrange...
    Et souvenons-nous que le bug est le plus souvent, mais pas toujours, situé entre la chaise et l'écran ;-)

  13. #13
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 090
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 090
    Points : 8 188
    Points
    8 188
    Billets dans le blog
    17
    Par défaut
    Echo ou print sont censées afficher, pas calculer.
    C'est ce qu'il font. echo/print affiche le résultat de l'évaluation de l'expression donnée en paramètre.

    L'instruction => echo
    L'expression en paramètre => 123 * 2 composée de 2 entiers

    Les types en PHP => https://www.php.net/types

    Afficher 1*2 et pas 2.
    C'est le cas quand tu demandes d'afficher le littéral "1*2" (une chaîne de caractères le cas échéant).

    Il faut bien distinguer ces 2 instructions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "123 * 2"; // On affiche une expression littérale (chaîne de caractère) => Son évaluation donnera "123 * 2"
    echo 123 * 2; // On affiche une expression numérique, ici le résultat d'un calcul => Son évaluation donnera 246
    Afficher un calcul devient ici afficher un résultat de calcul et pas afficher un calcul. On ne peut pas exactement dire que 1*2 soit un nombre.
    Non, quand l'expression est délimitée avec des " alors on a affaire à une chaîne de caractères, on affiche donc une chaîne de caractères, et la nature de ce qu'elle contient importe peu PHP.

    P.S : j'ai découvert que ma formule mathématique relevait de ce qui s'appelle un parcours d'arbre... " un concept fondamental en algorithmique" selon wikipedia... quelle chose étrange...
    Wikipedia s'emballe, ça peut être une simple pile. Ceci dit une pile peut être représentée par un arbre
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 19/03/2008, 10h35
  2. Afficher résultat fonction
    Par jcaspar dans le forum Langage
    Réponses: 4
    Dernier message: 04/09/2007, 10h22
  3. pb avec la fonction intval()
    Par LUCALP dans le forum Langage
    Réponses: 2
    Dernier message: 27/12/2006, 09h55
  4. Réponses: 6
    Dernier message: 19/10/2006, 14h58
  5. [C#]Incompréhension de la fonction Parse.
    Par Tournevyks dans le forum C#
    Réponses: 5
    Dernier message: 06/10/2006, 09h14

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