> Tous les forums > Forum des Webmasters
 array, boucle condition je suis perdu
Ajouter un message à la discussion
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";
echo ' <td>'.$array_sous_total[$row_test['id_com']].'</td>'."\n";

je me demande pq le sum_array ne prend pas alors que tu la déclare

$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']); //c'est la ligne 109
$somme += $totgen;

et apour les sous totaux il décèle bien tous les id_com mais ne fait pas de somme ?

Array
(
[4] => 0
[7] => 0
[8] => 0
[13] => 0
[20] => 0
[21] => 0
[25] => 0
[26] => 0
[99] => 0
[100] => 0
)

merci encore

Page : [1] 
Page 1 sur 1
cuistottlse
  Posté le 18/10/2008 @ 10:04 
Aller en bas de la page 
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

<?php $somme=0 ?>
<?php do { ?>
<tr>
<td><?php echo $row_test['id_com']; ?></td>
<td><?php echo strtoupper($row_test['ref_com']); ?></td>
<td><?php echo $row_test['libele']; ?></td>
<td><?php echo $row_test['prix']; ?></td>
<td><?php echo $row_test['quant']; ?></td>
<td><?php echo $row_test['total']= $row_test['prix']*$row_test['quant']; ?></td>
<td><?php echo $row_test['nom']; ?></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td><?php $totgen = array ($row_test['total']);
for($i=0;$i<sizeof($totgen);$i++) // tant que $i est inferieur au nombre d'éléments du tableau...
{ $somme= $somme + $totgen[$i];
echo $somme.'<br>' ;
// on affiche l'élément du tableau d'indice $i
} ?></
td>
</tr>

<?php } while ($row_test = mysql_fetch_assoc($test)); ?>

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é
Malcolm
 Posté le 18/10/2008 à 12:45 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

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.

cuistottlse
 Posté le 18/10/2008 à 13:22 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

comme je ne l'ai pas encore mis en ligne je ne peut pas te montrer exemple concret cela donne ceci

id_com prix quant total $somme

4 3 2 6 6

4 6 4 24 30 (6+24)

7 2 8 16 46 (30+16)

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
Malcolm
 Posté le 19/10/2008 à 10:23 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

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 :

  1. $somme visiblement tu l'écrases à chaque boucle "for", donc je présume que tu ne t'en sers pas ailleurs dans le code,
  2. j'ai mis une cellule en plus (td) pour afficher le sous total, si tu veux le mettre ailleurs, efface-la.

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
cuistottlse
 Posté le 19/10/2008 à 11:42 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
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

Malcolm
 Posté le 19/10/2008 à 12:17 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

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
cuistottlse
 Posté le 19/10/2008 à 13:14 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
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
(
[4] => 213
[7] => 73.8
[8] => 0
[13] => 666.6
[20] => 946.7
[21] => 234.8
[25] => 1085.9
[26] => 1020.2
[99] => 1051.8
[100] => 3346.7
)
mais bon il calcul cette fois ca avance

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

Malcolm
 Posté le 19/10/2008 à 13:32 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

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";
?>
Malcolm
 Posté le 19/10/2008 à 13:36 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

cuistottlse a écrit :

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

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.

cuistottlse
 Posté le 19/10/2008 à 14:08 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
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
$array_sous_total[$row_test['id_com']] = $total_ligne;

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
Malcolm
 Posté le 19/10/2008 à 17:00 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Ok, donc c'est résolu ?

pour le sous total : oui tu as entièrement raison, suis-je sot ...

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour participer à la discussion.
Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !
Recevoir PC Astuces par e-mail


La Lettre quotidienne +226 000 inscrits
Avec l'actu, des logiciels, des applis, des astuces, des bons plans, ...

Les bonnes affaires
Une fois par semaine, un récap des meilleurs offres.

Les fonds d'écran
De jolies photos pour personnaliser votre bureau. Une fois par semaine.

Les nouveaux Bons Plans
Des notifications pour ne pas rater les bons plans publiés sur le site.

Les bons plans du moment PC Astuces

Tous les Bons Plans
Radio réveil Lenovo Smart Clock Essential avec assistant Google à 17,99 €
17,99 € 49 € -63% @Darty
Barre de son Bose TV Speaker (bluetooth, optique, HDMI) à 179 €
179,00 € 249 € -28% @Amazon
Coffret d'embouts de vissage et clés à cliquet Bosch (27 pièces) à 16,98 €
16,98 € 23 € -26% @Amazon
SSD Interne M.2 NVMe PCIe 4.0 Samsung 980 PRO 1 To (avec dissipateur) à 114,94 €
114,94 € 140 € -18% @Cdiscount
Portable 17,3 pouces HP (FHD IPS, Ryzen 5 5500U, 16Go/512Go, Windows 11) à 599 €
599 € 699 € -14% @Leclerc
Portable 16 pouces Lenovo Legion 5i Pro (WQXGA 165Hz, Core i7, 32Go DDR5, 1To SSD, RTX3070) à 1599 €
1599 € 2299 € -30% @Lenovo
1 Lego acheté = le 2ème à -50% chez Cdiscount
@Cdiscount
Sélection de T-Shirts Top Gun, Minecraft, Stranger Things, Marvel, Disney, Fender à 16,99 €
16,99 € 19,99 € -15% @Amazon
-15 € dès 79 € sur les jouets chez Rakuten
-15 € @Rakuten
Ecran 27 pouces incurvé KTC H27S17 (QHD, 165 Hz, 1 ms, HDR10) à 219,76 € (+ mini enceinte Tronsmart Trip 10W étanche IPX7 offerte)
219,76 € 300 € -27% @Geekbuying

Sujets relatifs
je suis perdu
XML et XSLT avec Firefox.. je suis perdu?[Résolu]
boucle while
Boucle WHILE
variable et array
trier un array
trier résultat boucle while
créer site web je suis nul grave grave
Gestion des condition en php
condition
Plus de sujets relatifs à array, boucle condition je suis perdu
 > Tous les forums > Forum Forum des Webmasters