salut,
ce n'est pas parce que tu n'as pas vu un truc que tu ne peux l'utiliser. La vie de dev c'est beaucoup de recherche et d'apprentissage (tout le temps)
php 5.5 ? faudrait p'tet voir pour être a jour
D'abord le "esthétique"
a priori tu ne travail pas avec avec un niveau d'erreur suffisant. Il est important (pour ne pas obligatoire) de développer avec le paramètre error_reportin = E_ALL et bien sur display_error = on
avec ceci tu verrais une erreur indiquant que $total n'existe pas dans ce code
<?php
foreach ($piece as $index_piece2 => $valeur_piece2 ){
$total = $total + $_POST[$index_piece2] * $piece[$index_piece2];
}
ce n'est pas grand chose mais permet d'éviter des problèmes.
d'ailleurs tu as aussi une erreur parce que tu fait des calculs sur des chaines de caractères

=> A non-numeric value encountered in (ligne 71 dans mon cas)
pour éviter cela utilise la fonction [url=
http://php.net/intval]intval[/php]
=> intval($_POST[$index_piece2])
de manière générale pense à initialiser les variables. ($total = 0; par exemple)
Avec tes paramètres
- fanta moyen
- 1x 2€
- 1 x 1€
on obtient
Cette canette vous à coûté 2.5 €.
Votre monnaie est de 0.5 €
Donc cette partie fonctionne bien
Pour la gestion du rendu de monnaie effectivement c'est pas simple.
Ton affichage ne permet pas de comprendre ce que tu fais vu que tu affiche tout et sans information (on ne sais a quoi cela correspond 0.2 une image de pièces de 20cents tu donnes 20% d'une pièce ?)
il faut que tu indiques le nombre pièce pas la valeur.
$piece['2euro']=2;
$piece['1euro']=1;
$piece['50cents']=0.5;
$piece['20cents']=0.2;
$piece['10cents']=0.1;
$piece['5cents']=0.05;
$piece['2cents']=0.02;
$piece['1cents']=0.01;
$stock_piece['2euro']=4;
$stock_piece['1euro']=2;
$stock_piece['50cents']=0;
$stock_piece['20cents']=1;
$stock_piece['10cents']=1;
$stock_piece['5cents']=5;
$stock_piece['2cents']=5;
$stock_piece['1cents']=5;
tu peux utiliser un tableau 2D
$piece['2euros']['valeur'] = 5
$piece['2euros']['stock'] = 1
avec tes données tu dois avoir en résultat
- 20c x 1
- 10c x1
- 5c x 4
total 20 +10 + 5x4 (20) = 50 centimes
le coté technique
avec un peu de débug on se rend compte qu'a un moment (pour la dernière pièce de 5c) on se retrouve avec ($monnaie >= $value) == false avec un stock de pièce == 2
pourquoi ?
parce que 0.05 >= 0.05 retourne true O_o
d'ailleurs la doc indique
Ainsi, ne faites jamais confiance aux derniers chiffres d'un nombre décimal, mais aussi, ne comparez pas l'égalité de 2 nombres décimaux directement
LE problème c'est que
<?php
$v = 0.05;
if($v >= $v){
echo 'you win';
}else {
echo 'loose';
}
=> affiche you win
mais pas dans ce cas alors que php nous indique bien le type et la valeur
mais le truc en fait c'est que les valeurs sont vraiment différente

non je ne suis pas dingue, la [url=
http://php.net/number_format]number_format[/php] permet de formater un nombre en indiquant le nombre de décimale que l'on veux.
et bien figure toi qu'a partir de la 17ème décimale on à
et avec 20 on voi que même ta valeur figée n'est pas parfaite
bon tu va me dire que t'en a rien a foutre d'avoir autant de décimale. Oui mais c'est la représentation interne d'un nombre a virgule qui fait cela (ça n'existe pas les virgule en informatique

).
maintenant les solutions (ou il y en a

)
- utiliser la fonction [url=
http://php.net/manual/fr/function.bccomp.php]bccomp[/php]
- utiliser des entiers et compter qu'en centime 2€ => 200, 5c => 5 et la plus de problème de conversion vu que c'est toi qui garde coté serveur les valeurs
je te conseil la seconde solution.
Pour l'affichage je préfères gérer un tableau de résultat qui va permettre d'afficher simplement le résultat.
A moins que le but ce soit d'avoir une ribambelle d'image pour chaque pièce ?
dans mon cas
$result = [];
foreach ($piece as $i => $value){
while ($monnaie >= $value && $stock_piece[$i] > 0 ){
// si l'index existe pas dans le tableau
if(empty($result[$i])){
$result[$i] = 1;
}else {
$result[$i]++;
}
$monnaie -= $value;
$stock_piece[$i]--;
}
}
// affichage du résultat
foreach ($result as $key => $value) {
echo $value , '<img src="images/',$i,'.png" alt="pièce de ',$key,'" /><br />';
}
@+