Une fonction pour convertir

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous,
J'aimerais effectuer des conversions de mesures aéronautiques. L'utilisateur entre la valeur et l'unité et retrouve cette valeur convertie dans toutes les autres unités utilisées dans l'aéronautique. En codant, j'ai remarqué que mon code était affreusement répétitif… J'ai crû comprendre qu'il fallait absolument éviter cela. Donc j'ai commencé à réfléchir à une fonction ou une classe qui pourrait simplifier tout ça, mais j'arrive vraiment pas à voir comment faire ça. Voici mon code :

 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
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
 if (isset($_POST['value']) && isset($_POST['unit'])) {
            $value = floatval($_POST['value']);
            $value == 0 ? $value = 1 : $value = $value; // Si n'importe quoi est envoyé, $value sera égale à 1

            $nbDecimal = 3;

            switch ($_POST['unit']) {
                // Vitesses
                case 'km/h':
                    echo '<p>'. $value . ' km/h = ' . number_format($value/1.852, $nbDecimal) . ' kt.</p>' ; // km/h vers kt
                    echo '<p>'. $value . ' km/h = ' . number_format($value * 0.2777777777778, $nbDecimal) . ' m/s.</p>' ; // km/h vers m/s
                break;

                case 'kt':
                    echo '<p>'. $value . ' kt = ' . number_format($value*1.852, $nbDecimal) . ' km/h.</p>' ; // kt vers km/h
                    echo '<p>'. $value . ' kt = ' . number_format($value*0.51444444444, $nbDecimal) . ' m/s.</p>' ; // kt vers m/s
                break;

                case 'm/s':
                    echo '<p>'. $value . ' m/s = ' . number_format($value*3.6, $nbDecimal) . ' km/h.</p>' ; // m/s vers km/h
                    echo '<p>'. $value . ' m/s = ' . number_format($value*1.9438444924571, $nbDecimal) . ' kt.</p>' ; // m/s vers kt
                break;

                // Longueurs
                case 'ft':
                    echo '<p>'. $value . ' ft = ' . number_format($value/3.2808, $nbDecimal) . ' m.</p>' ; // ft vers m
                    echo '<p>'. $value . ' ft = ' . number_format($value*0.0003048, $nbDecimal) . ' km.</p>' ; // ft vers km
                    echo '<p>'. $value . ' ft = ' . number_format($value*0.33333, $nbDecimal) . ' yd.</p>' ; // ft vers yd
                break;

                case 'm':
                    echo '<p>'. $value . ' m = ' . number_format($value*3.2808399, $nbDecimal) . ' ft.</p>' ; // m vers ft
                    echo '<p>'. $value . ' m = ' . number_format($value/1000, $nbDecimal) . ' km.</p>' ; // m vers km
                    echo '<p>'. $value . ' m = ' . number_format($value*1.0936, $nbDecimal) . ' yd.</p>' ; // m vers yd
                break;

                case 'km':
                    echo '<p>'. $value . ' km = ' . number_format($value*3280.8398950131, $nbDecimal) . ' ft.</p>' ; // km vers ft
                    echo '<p>'. $value . ' km = ' . number_format($value*1000, $nbDecimal) . ' m.</p>' ; // km vers m
                    echo '<p>'. $value . ' km = ' . number_format($value*1093.61329834, $nbDecimal) . ' yd.</p>' ; // km vers yd
                break;

                case 'yd':
                    echo '<p>'. $value . ' yd = ' . number_format($value*3.00, $nbDecimal) . ' ft.</p>' ; // yd vers ft
                    echo '<p>'. $value . ' yd = ' . number_format($value*0.9144, $nbDecimal) . ' m.</p>' ; // yd vers m
                    echo '<p>'. $value . ' yd = ' . number_format($value/1093.61329834, $nbDecimal) . ' km.</p>' ; // yd vers km 
                break;


                // Températures
                case '°C':
                    echo '<p>'. $value . ' °C = ' . number_format(($value*1.8000) + 32.00, 2) . ' °F.</p>' ; // °C vers °F
                    echo '<p>'. $value . ' °C = ' . number_format($value+273.15, 2) . ' K.</p>' ; // °C vers K
                break;

                case '°F':
                    echo '<p>'. $value . ' °F = ' . number_format(($value-32)/1.8000, 2) . ' °C.</p>' ; // °F vers °C
                    echo '<p>'. $value . ' °F = ' . number_format((($value-32)/1.8000)+273.15, 2) . ' K.</p>' ; // °F vers K
                break;

                case 'K':
                    echo '<p>'. $value . ' K = ' . number_format($value-273.15, 2) . ' °C.</p>' ; // K vers °C
                    echo '<p>'. $value . ' K = ' . number_format(($value*(9/5))-459.67, 2) . ' °F.</p>' ; // K vers °F
                break;

                default:
                    echo "<strong>ERREUR:</strong> Les valeurs entrées sont incorrectes ou incomplètes.";
                break;
            }
        }
?>

Donc les valeurs sont obtenues grâce aux variables $_POST['value'] (contient la valeur à convertir) et $_POST['unit'] contient l'unité d'origine.
Si vous savez comment faire, merci d'avance !

+0 -0

Voici comment je vois les choses:

je remarque qu'il y a toujours deux choses dans tes conversions :

  • un multiplicateur
  • un additionneur

parfois le multiplicateur n'apparait pas, car en fait c'est une multiplication par 1.
parfois l'additionneur n'apparait pas, car en fait on ajoute 0.

Donc ma première idée serait de dire : on va faire un tableau de conversion :

1
2
3
4
5
{
    "km/h" : { "m/s": [0.2777777777778, 0], "kt":[1/1.852, 0]},
    "m/s" : { "km/h": [3.5, 0], "kt":[1.9438444924571, 0]},
    "kt": { "km/h": [1.852, 0], "m/s":[ 0.51444444444, 0}]}
}

tableau de conversion des distance

ensuite tu n'auras plus qu'à faire une fonction qui convertit une unité en une autre:

1
2
3
4
5
6
7
<?php
//en supposant que ton tableau s'appelle conversion_tab
function convert($from_unit, $target_unit, $from_value){
    $multiplier = $conversion_tab[$from_unit][$target_unit][0];
    $origin_ordinate = $conversion_tab[$from_unit][$target_unit][1];
    return $from_value." $from_unit = ".number_format(($from_value*$multiplier)-$origin_ordinate, 2);
}

Merci beaucoup de ta réponse, et excuse moi du retard de la mienne.
Et effectivement, je n'avais absolument pas pensé à utiliser un tableau (en faite, je n'y pense jamais… :-° ). Donc je pourrais imaginer un tableau comme celui-ci ?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php

$convertion_tab = array (
                         "km/h" => array(
                                         "kt" => 1/1.852, 
                                         "m/s" => 0.2777777777778,
                                         "ft/min" => 54.68066);
                         "kt" => array(
                                         "km/h" => 1.852,
                                         "m/s" => 0.51444444444,
                                         "ft/min" => 1.687810);
                         "m/s" => array(
                                         "km/h" => 3.6,
                                         "kt" => 1.9438444924571,
                                         "ft/min" => 196.8504);
                         "ft/min" => array(
                                         "km/h" => 1/54.68066,
                                         "kt" => 1/101.2686,
                                         "m/s" => 1/196.8504);
                         );

Ça pourrait fonctionner? Merci de votre aide!

Merci beaucoup. Mais que veux-tu dire par additionneurs ? Je ne vois pas de quoi tu parles…

EDIT : J'avance dans ma fonction, mais un problème se présente.. (Je ne comprend absolument pas pourquoi..)

 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
<?php
$convertion_tab = array (
                         "km/h" => array(
                                         "kt" => 1/1.852, 
                                         "m/s" => 0.2777777777778,
                                         "ft/min" => 54.68066),
                         "kt" => array(
                                         "km/h" => 1.852,
                                         "m/s" => 0.51444444444,
                                         "ft/min" => 1.687810),
                         "m/s" => array(
                                         "km/h" => 3.6,
                                         "kt" => 1.9438444924571,
                                         "ft/min" => 196.8504),
                         "ft/min" => array(
                                         "km/h" => 1/54.68066,
                                         "kt" => 1/101.2686,
                                         "m/s" => 1/196.8504));

if(array_key_exists("km/h", $convertion_tab)) {
    echo("saluuuuut");
}

function convert($from_unit, $from_value, $nbDecimal = 3)
{
    if (!array_key_exists($from_unit, $convertion_tab)) {
        echo '<p><strong>ERREUR : </strong>L\'unitée est inconnue.</p>';
    }
    else {
        [...]
    }
}
// TEST
convert("km/h", 165, 3);

Le premier test me renvoie bien saluuuuut et celui de la fonction me renvoie aussi ERREUR : L'unitée est inconnue.… Pourquoi???

+0 -0

Ah d'accooooord! Du coup voici ma fonction :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
function convert($units_tab, $from_unit, $from_value, $nbDecimal = 3)
{
    if (!isset($units_tab[$from_unit])) {
        echo '<p><strong>ERREUR : </strong>L\'unitée est inconnue.</p>';
    }
    else {
        if ($_POST['type_conv'] != 'temperature' && $from_value <= 0) { // On check qu'une vitesse ou une longueur ne soit pas négative.
           $from_value = 1;
        }

        foreach ($units_tab[$from_unit] as $target_unit => $multiplier) {
            echo '<p>'. $from_value . ' ' . $from_unit . ' = ' . number_format($from_value * $multiplier, $nbDecimal, ',', ' ') . ' ' . $target_unit . '.</p>' ;
        }
    }
}

Mais je ne comprend toujours pas de coup tu parlais en disant additionneurs ?

+0 -0

Comme c'est vraiment spécifique aux températures et que l’additionneur n'est jamais au même endroit je pense que je les écrirais à la main. En tout cas, merci beaucoup, mon code est vraiment mieux foutu maintenant !

Si, il est toujours au même endroit. C'est juste que parfois il vaut 0 ;)

Bah.. Par exemple, cette ligne :

1
2
<?php
echo '<p>'. $value . ' °C = ' . number_format(($value*1.8000) + 32.00, 2) . ' °F.</p>' ; // °C vers °F

Me permet de passer de Celsius vers des Fahrenheit. Je multiplie d'abord par 1.8 puis j'ajoute 32. Alors que si je prend la ligne qui me permet de passer des Fahrenheit aux Kelvin :

1
2
<?php
echo '<p>'. $value . ' °F = ' . number_format((($value-32)/1.8000)+273.15, 2) . ' K.</p>' ; // °F vers K

Je retire d'abord 32, puis je divise par 1.8 (ce qui revient à multiplier par 1/1.8) puis je rajoute 273.15. Je ne vois pas trop comment l'additionneur peut être au même endroit ici..

Je retire d'abord 32, puis je divise par 1.8 (ce qui revient à multiplier par 1/1.8) puis je rajoute 273.15. Je ne vois pas trop comment l'additionneur peut être au même endroit ici..

un petit développement?

en mathématique :

$$ \frac{a - 32}{1.8} + 273.15 = \frac{a}{1.8} - \frac{32}{1.8} + 273.15 = \frac{a}{1.8} + 255.3722222222 $$

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte