Bonjour,

Voila je rencontre un petit problème avec mon code.

je veux afficher une fraction en php : pour cela j'ai écrit

$a=3;

$b=2;

$c="$a/$b";

echo $c; //cela affiche 3/2

mais d'autre part je veux multiplier $c par un nombre entier;

echo $c*2; //cela m'affiche une err
( ! ) Notice: A non well formed numeric value encountered

si quelqu'un peut m'aider

et merci d'avance;

5 réponses


Salut,
Il faut juste supprimer les guillemet :
$c=$a/$b;
Sinon ton $c est considéré comme (string).

Ensuite tu n'auras plus de soucis à faire ta multiplication.

maewa
Auteur

salut,
merci pour ta reponse ,mais j'ai besoins d'afficher la fraction "$a/$b", y a -t-il une méthode pour afficher la fractio sans utilser " "

J ai essayé (float)$c
ca ne fonctionne pas.

J ai essayé settype($c, "float")
ca ne fonctionne pas.

A priori, il te faut creer 2 variables : une string et une numerique.
Tu peux utiliser par exemple, le meme nom de variable mais avec un underscore pour la variable string.
Ca donnerait :

$a = 3;
$b = 2;

$c_ = "$a/$b";
$c  =  $a/$b;

echo "$c_ = ".$c;  //   3/2 = 1.5
maewa
Auteur

merci baucoup pour ta réaction, je vais l'essayer

sinon avec un petit programe

index.php

<?php
require_once('calcul.php');

$f = '(1*x)+(320-y)-(z*50)+(40/z)';
echo '<br>f = '.$f.'<br><br>';

$x=152 ; $y=20; $z=2;
echo '... avec x . y . z  = '.$x.' . '.$y.' . '.$z;

calcul($f, $x, $y, $z);

// **********************

echo '<br><br><hr><br>';
$f='(57954+32800)-(x*2)+(29000/y)-(456900/z)';
echo '<br>f = '.$f.'<br>';

calcul($f, $x, $y, $z);

et
calcul.php

<?php

function affiche(array $tab, int $lentab)
{
    echo '<br> f = &nbsp; ';
    for($i=0; $i<$lentab; $i++){
        echo ' '.$tab[$i];
    }
}

function calcul(string $f, int $x, int $y, int $z)
{
    // 1. incorporation de la string dans un array ($tab)
    //    avec remplacement des variables x y z par leur valeur
        $len=strlen($f); // = 27 caracteres dans la string '$f'
        $tab=[];
        for($i=0; $i<$len; $i++)
        {
            switch ($f[$i])
            {
                case 'x':
                    $tab[$i] = $x;
                    break;
                case 'y':
                    $tab[$i] = $y;
                    break;
                case 'z':
                    $tab[$i] = $z;
                    break;
                default:
                    $tab[$i]=$f[$i];
                    break;
            }
        }
        $lentab=count($tab); // 27 elements dans $tab dont 4 integer.
    // 2. modif. du cast des string 'numeric' en 'integer'
    //    et reconstitution des nombres ('3' '2' '0' -> 320 integer)
        for($i=0; $i<$lentab; $i++)
        {
            if( is_string($tab[$i]) && is_numeric($tab[$i]) )
            {
                $numericBefore = preg_match('/[0-9]/', $tab[$i-1]);
                $numericAfter  = preg_match('/[0-9]/', $tab[$i+1]);
                if( ($numericBefore==0) && ($numericAfter==0) )
                    {settype($tab[$i],'int');}                    
                else 
                    {  
                        for($j=($i+1); $j<$len; $j++)
                        {  
                            if(is_numeric($tab[$j]))
                            {
                                $tab[$i]=$tab[$i].$tab[$j];
                                $tab[$j]='s';
                            } else {break ;}
                        }
                        settype($tab[$i],'int');
                    }
            }elseif($tab[$i]==='s'){unset($tab[$i]);}
        } 

    // 3. calcul niveau 1 
        echo '<br><br>';
        $tab = array_values($tab);
        $lentab = count($tab); // = 23
        affiche($tab, $lentab);
        echo '<br>';
        for ($i=0; $i<$lentab; $i++)
        {
            if ( is_integer($tab[$i]) && $tab[$i+1]!==')' )
            {
                $operator = $tab[$i+1];
                switch ($operator) 
                {
                    case '+':
                        $tab[$i] = $tab[$i] + $tab[$i+2];
                        break;
                    case '-':
                        $tab[$i] = $tab[$i] - $tab[$i+2];
                        break;
                    case '*':
                        $tab[$i] = $tab[$i] * $tab[$i+2];
                        break;
                    case '/':
                        if ($tab[$i+2] !== 0){
                            $tab[$i] = $tab[$i] / $tab[$i+2];
                            if(is_float($tab[$i])){round($tab[$i],2);}
                        } else {echo '<br>Erreur (division par 0) !';}
                        break;
                    default:
                        echo '<br>erreur (operateur non valide) !';
                        break;
                }
                $tab[$i+1]='s'; $tab[$i+2]='s'; 
            } elseif($tab[$i]=='s'){ unset($tab[$i]);}
        }

        $tab = array_values($tab);
        $lentab = count($tab); // = 15
        affiche($tab, $lentab);

    // 4. calcul niveau 2 
        echo '<br>';
        // on supprime les parentheses du array
        for ($i=0; $i<$lentab ; $i++) {
            if($tab[$i]=='('){
                unset($tab[$i]);
                $tab[$i+2]='s';  
            }elseif($tab[$i]=='s'){
                unset($tab[$i]);}
        }
        $tab = array_values($tab);
        $lentab = count($tab); // $lentab = 7
        affiche($tab, $lentab);

    // 5. calcul niveau 3 (final)
        echo '<br><br>';
        $result = 0;
        for($i=0; $i<$lentab; $i++)
        {
            if($i==0)
            {
                $operator = $tab[$i+1];
                switch ($operator) 
                {
                    case '+':
                        $result = $result + $tab[$i]+$tab[$i+2];
                        $tab[$i+2]='s';
                        break 1;
                    case '-':
                        $result = $result - $tab[$i]-$tab[$i+2];
                        break 1;
                    case '*':
                        $result = $tab[$i]*$tab[$i+2];
                        break 1;
                    case '/':
                        if($tab[$i+2] !== 0){
                            $result = $tab[$i]/$tab[$i+2];
                        } else {echo 'Erreur (division par 0';}
                        break 1;
                    default:
                        echo 'erreur';
                        break 1;
                }
                $tab[$i+2]='s';
            } 
            elseif(is_int($tab[$i])) 
            {
                $operator = $tab[$i-1];
                switch ($operator) 
                {
                    case '+':
                        $result = $result + $tab[$i];
                        $tab[$i+2]='s';
                        break 1;
                    case '-':
                        $result = $result - $tab[$i];
                        break 1;
                    case '*':
                        $result = $tab[$i]*$tab[$i+2];
                        break 1;
                    case '/':
                        if($tab[$i+2] !== 0){
                            $result = $tab[$i]/$tab[$i+2];
                        } else {echo 'Erreur (division par 0';}
                        break 1;
                    default:
                        echo 'erreur';
                        break 1;
                }
            }
        }

        echo ' f = &nbsp; '.$result;
}

on obtient :

 = (1*x)+(320-y)-(z*50)+(40/z)

... avec x . y . z = 152 . 20 . 2

f =   ( 1 * 152 ) + ( 320 - 20 ) - ( 2 * 50 ) + ( 40 / 2 )

f =   ( 152 ) + ( 300 ) - ( 100 ) + ( 20 )

f =   152 + 300 - 100 + 20

f =   372

---------------------------------------------------------------------

f = (57954+32800)-(x*2)+(29000/y)-(456900/z)

f =   ( 57954 + 32800 ) - ( 152 * 2 ) + ( 29000 / 20 ) - ( 456900 / 2 )

f =   ( 90754 ) - ( 304 ) + ( 1450 ) - ( 228450 )

f =   90754 - 304 + 1450 - 228450

f =   -89608