> 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
199,99 €Ecran 23,8 pouces Acer Nitro XV240Y (FullHD, IPS, 1 ms, 165 Hz, FreeSync; pied réglable) à 199,99 €
259 € -23%

La Fnac fait une promotion sur l'écran 23,8 pouces Nitro XV240YPbmiiprx qui passe à 199,99 € alors qu'on le trouve ailleurs à partir de 259 €. Cet écran dédié aux joueurs dispose d'une dalle IPS Full HD de 1920x1080 pixels. Grâce à sa compatibilité Freesync et Gsync (165Hz) et son temps de réponse rapide de 1 ms, ce moniteur Acer offre une excellente fluidité d'affichage. Interfaces : 2 x HDMI, DP (1.2), Sortie de ligne audio. Pied ergonomique avec réglage de l'inclinaison, de la hauteur, du panoramique et de la rotation.


Voir l'offre
14,99 €Souris sans-fil ergonomique verticale Trust Verro à 14,99 €
39,99 € -63%

Cdiscount fait une promotion sur la souris sans-fil ergonomique verticale Trust Verro qui passe à 14,99 € au lieu de 39,99 €. Travaillez confortablement pendant de longues périodes, tout en prévenant les douleurs au bras et au poignet.


Voir l'offre
19,99 €Détecteur de fumée et de monoxyde de carbone interconnecté Aegislink à 19,99 €
39,99 € -50%

Amazon fait une promotion sur le détecteur de fumée et de monoxyde de carbone Aegislink qui passe à 19,99 € avec le code promo ZBXO75BX au lieu de 39,99 €. Avec pile lithium remplaçable, écran LCD montrant les concentrations de CO et le niveau de la pile en temps réel, alarme > à 85 db, bouton Test. Si vous en mettez plusieurs, il est interconnecté aux autres appareils : lorsqu'un appareil détecte une situation dangereuse, tous les appareils interconnectés se déclenchent, ce qui vous alerte dans toute la maison. 


Voir l'offre
49,99 €SSD Crucial P2 500 Go (3D NAND, NVMe, PCIe, M.2, 2400 Mo/s) à 49,99 €
61,99 € -19%

Amazon fait une promotion sur le SSD Crucial P2 500 Go (3D NAND, NVMe, PCIe, M.2) qui passe à 49,99 €. On le trouve ailleurs à partir de 61,99 €. Ce SSD offre des vitesses de lecture/écriture séquentielle allant jusqu’à 2 400/ 1 900 Mo/s. Il est garanti 5 ans. La livraison est gratuite.


Voir l'offre

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