| ||||||||
Petit astucien | Bonjour voici le code que j'utilise actuellement pour affiche le total général d'une commande et qui fonctionne très bien
Dans un array j'injecte tous les $row_test['total'] j'effectue une somme --> pour chaque enregistrement j'affiche le cumul de la somme cela me donne donc un total général. J'aimerai perfectionner ce script pour avoir également un sous total par id_com cela fait 2 jours que j'essaie différents scénarios un array supplémentaire une table tampon ?? je suis ouvert à toute suggestion pour stucturer cela Merci Alain | |||||||
Publicité | ||||||||
| ||||||||
![]() ![]() | Hello, je ne comprends pas la boucle for tant que $i est inferieur au nombre d'éléments du tableau : pourquoi ne pas avoir simplement utilisé la fonction array_sum($array) ? Peux-tu donner un exemple du résultat produit, et un du résultat souhaité ?
PS : pour optimisation, ce code ne devrait pas imbriquer autant PHP dans HTML. | |||||||
Petit astucien | comme je ne l'ai pas encore mis en ligne je ne peut pas te montrer exemple concret cela donne ceci
etc... pour en arriver à un $somme qui sera égal au total général (c'était le but escompté)et je voudrait arriver par je ne sait quel moyen encore à afficher un sous total par id_com donc ici dans cet exemple id_com 4 sous total 30 id_com 7 sous total 16 et ainsi de suite pour les différents id_com. Je pourrai bien entendu récupérer l' id_com et ne faire l'affichage que sur cet id_com là mais cela m'obligerai à l'afficher dans une autre page. Pour ce qui est de ton array_sum cela m'éviterai peut être qq lignes de code mais bon... merci Modifié par cuistottlse le 18/10/2008 13:25 | |||||||
![]() ![]() | en fait, on peut le faire relativement simplement. Mais pour ça c'est plus simple si on fait un code plus "propre", c.à.d. sans passer son temps à ouvrir et fermer PHP.Fais l'essai avec ce code ci-dessous. YA 2 trucs que je ne savais pas pour le réaliser :
En outre, j'ai demandé l'affichage du tableau des sous totaux, que tu puisses voir si j'ai bien compris ta demande. <?php $totgen = 0; $array_sous_total = array(); // les sous totaux des id_com while ($row_test = mysql_fetch_assoc($test)) // pour chaque ligne qu'on va afficher { $somme = 0; // sous total de la ligne $row_test['total'] = $row_test['prix'] * $row_test['quant']; // on calcule le total général à chaque ligne $totgen = array_sum($row_test['total']); $somme += $totgen; // sous total id_com : on le crée dans le tableau avec la clé correspondante // pour id_com X : $array_sous_total['X'] if (!array_key_exists($row_test['id_com'], $array_sous_total)) { // la clé n'existe pas on la crée et on l'initialise (sous total) à zéro $array_sous_total[$row_test['id_com']] = 0; } else { // la clé existe déjà, donc on incrémente ce sous total $array_sous_total[$row_test['id_com']] += $somme; }; // on affiche les lignes echo '<tr>'."\n"; echo ' <td>'.$row_test['id_com'].'</td>'."\n"; echo ' <td>'.strtoupper($row_test['ref_com']).'</td>'."\n"; echo ' <td>'.$row_test['libele'].'</td>'."\n"; echo ' <td>'.$row_test['prix'].'</td>'."\n"; echo ' <td>'.$row_test['quant'].'</td>'."\n"; echo ' <td>'.$row_test['total'].'</td>'."\n"; echo ' <td>'.$row_test['nom'].'</td>'."\n"; echo ' <td> </td>'."\n"; echo ' <td> </td>'."\n"; echo ' <td>'.$totgen.'</td>'."\n"; echo ' <td>'.$somme.'</td>'."\n"; echo ' <td>'.$array_sous_total[$row_test['id_com']].'</td>'."\n"; echo '</tr>'."\n"; }; // pour voir ce que ça donne pour les sous totaux echo '<pre>'."\n"; print_r($array_sous_total); echo '</pre>'."\n"; ?> Modifié par Malcolm le 19/10/2008 10:24 | |||||||
Petit astucien | merci Malcom cela avance je vais étudier cela de près j'obient Warning: array_sum(): The argument should be an array in c:\program files\easyphp1-8\www\sitescore\litterature_original\testsql222st.php on line 109 |
4
|
L2
|
DOUZE ET DOUZE Edition (USA)
|
8
|
1
|
8 0 0
Cela affiche donc bien id_com /ref_com/libellé/prix/quant/total/ pourquoi 0 0 qui devrait correspondre echo ' <td>'.$somme.'</td>'."\n"; je me demande pq le sum_array ne prend pas alors que tu la déclare
et apour les sous totaux il décèle bien tous les id_com mais ne fait pas de somme ? Array merci encore | |
![]() ![]() | déjà dans ton script initial, tu dois avoir une erreur avec ça :
car le signe = signifie "affectation", en gros il ne doit t'afficher que 1 ou 0 (majoritairement et exclusivement 1) si le stockage du calcul dans $row_test['total'] s'est bien effectué ... Pour le array sum : oui, c'est ton sizeof qui me perturbe un peu, je regarde ça de suite.
EDIT : en gros, quelle différence y a-t-il entre $somme et $totgen pour toi ? Modifié par Malcolm le 19/10/2008 12:19 | |||||||
Petit astucien | je vient de changer qq chose j'ai remplacé ton array_sum par ma "fameuse boucle" que dont tu disait qu'elle pouvait être remplacée par un array_sum du coup l'affichage du rableau est nikel!!! J'ai lu que array_sum ne fonctionnait correctement qu'à partir d'un php.X sur mon easyphp c'est la version php 4.3.1 par contre pour les sous totaux j'ai des réponses totalement fausses ? Array La différence entre $totgen & $somme dans mon script initial j'avoue que j'ai été confu dans leurs noms $totgen c'est mon total ligne et $somme la somme de mes totgen je ferai mieux des les appeler $tot_ligne & $tot_general pour rester dans la logique | |||||||
![]() ![]() | OK. J'en conclus donc que $row_test['total'] vaut $total_ligne. Voici un nouvel essai de mon code. J'ai mis, à 2 endroits, un sprintf("%3.3f" pour avoir un nombre à virgule flottante (cas d'un prix non entier numérique) afin d'être sûr que lorsque je dis "+" ça soit bien l'addition mathématique qui soit faite et non une concaténation (genre 2 + 3.50 = 5.50 et non 23.50) <?php $total_general = 0; $array_sous_total = array(); // les sous totaux des id_com while ($row_test = mysql_fetch_assoc($test)) // pour chaque ligne qu'on va afficher { $total_ligne = 0; // sous total de la ligne $total_ligne = $row_test['prix'] * $row_test['quant']; // on calcule le total général à chaque ligne $total_general += sprintf("%3.3f", $total_ligne); // sous total id_com : on le crée dans le tableau avec la clé correspondante // pour id_com X : $array_sous_total['X'] if (!array_key_exists($row_test['id_com'], $array_sous_total)) { // la clé n'existe pas on la crée et on l'initialise (sous total) à zéro $array_sous_total[$row_test['id_com']] = 0; } else { // la clé existe déjà, donc on incrémente ce sous total $array_sous_total[$row_test['id_com']] += sprintf("%3.3f", $total_ligne); }; // on affiche les lignes echo '<tr>'."\n"; echo ' <td>'.$row_test['id_com'].'</td>'."\n"; echo ' <td>'.strtoupper($row_test['ref_com']).'</td>'."\n"; echo ' <td>'.$row_test['libele'].'</td>'."\n"; echo ' <td>'.$row_test['prix'].'</td>'."\n"; echo ' <td>'.$row_test['quant'].'</td>'."\n"; echo ' <td>'.$row_test['total'].'</td>'."\n"; echo ' <td>'.$row_test['nom'].'</td>'."\n"; echo ' <td> </td>'."\n"; echo ' <td> </td>'."\n"; echo ' <td>'.$total_general.'</td>'."\n"; //echo ' <td>'.$total_ligne.'</td>'."\n"; echo ' <td>'.$array_sous_total[$row_test['id_com']].'</td>'."\n"; echo '</tr>'."\n"; }; // pour voir ce que ça donne pour les sous totaux echo '<pre>'."\n"; print_r($array_sous_total); echo '</pre>'."\n"; ?> | |||||||
![]() ![]() | cuistottlse a écrit : En fait, ce qui me gênait un peu c'est que juste au dessus de la fameuse boucle, tu déclarais ton tableau ... $totgen = array ($row_test['total']); Donc ton tableau n'a qu'une seule ligne à chaque fois, et ce n'était pas un vrai calcul du total. | |||||||
Petit astucien | Super merci Malcom j'ai juste changé ceci pour que la première ligne soit prise en compte dans le sous total par id_com // la clé n'existe pas on la crée et on l'initialise (sous total) à zéro je vais décortiquer cela bien à mon aise pour bien comprendre et ne plus revenir à la charge avec le même genre de problème lol Alain Modifié par cuistottlse le 19/10/2008 14:17 | |||||||
![]() ![]() | Ok, donc c'est résolu ? pour le sous total : oui tu as entièrement raison, suis-je sot ... | |||||||
|
Les bons plans du moment PC Astuces | Tous les Bons Plans | ||||||||||||||||
|