Bonjour à tous,
J'ai une boucle qui liste des produits et je voudrais pouvoir comparer le dernier produit avec l'avant dernier.
Si ils sont identiques traitement A sinon traitement B.
Merci d'avance de votre aide.
Bonjour à tous,
J'ai une boucle qui liste des produits et je voudrais pouvoir comparer le dernier produit avec l'avant dernier.
Si ils sont identiques traitement A sinon traitement B.
Merci d'avance de votre aide.
Bonjour,
si tu veux juste comparer le dernier et l'avant dernier élément, il n'y a pas d'intérêt à faire ca dans une boucle.
Si dans une boucle tu veux comparer l'élément courant avec celui qui le précède :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 // $liste est un array $dernier = count($liste) - 1; $avant_dernier = $dernier--; if($liste[$dernier] == $liste[$avant_dernier]){ // traitement A } else{ // traitement B }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 // $liste est un array $preceding_item = null; foreach($liste as $item){ if(is_null($preceding_item) || $preceding_item != $item){ // traitement A } else{ // traitement B } $preceding_item = $item; }
Oui mais ma boucle vient d'une requête qui me liste des données de mes bases.
Merci d'avance
Re,
dans les deux cas la réponse se trouve juste au dessus, que ce soit si tu veux comparer les deux derniers enregistrements ou si tu veux comparer l'enregistrement courant (celui que tu parcours dans ta boucle) avec l'enregistrement précédent (celui que tu viens juste de parcourir dans ta boucle).
Ok,
Bon j'ai essayé un truc comme ça :
J'ai juste mis une balise couleur afin de voir ds mon tableau si cela fonctionne ou pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 $article = array(); while ($donnees_vente_mois = mysql_fetch_array($retour_vente_mois)) { $article[$donnees_vente_mois['article']] = $donnees_vente_mois['article']; foreach($article as $liste) { $dernier = count($liste) - 1; $avant_dernier = $dernier-1; if($liste[$dernier] == $liste[$avant_dernier]) { $couleur = " bgcolor='#999999'";} else { $couleur = ""; } } }
J'ai le message d'erreur suivant :
Notice: Uninitialized string offset: -1
Merci encore pour ton aide !
Re,
pourquoi mettre le foreach dans le while ?
Il y a beaucoup de fautes de synthaxe et du traitements inutiles, tu n'as pas trop compris mon exemple.
Pour finir, en fait ce que tu veux faire c'est colorier une ligne sur 2 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 $index = 0; while ($donnees_vente_mois = mysql_fetch_array($retour_vente_mois)){ if($index % 2 == 0){ // nombre pair echo '<font style="color:">'.$donnees_vente_mois[0].'</font>'; } else{ // nombre impair echo $donnees_vente_mois[0]; } $index++; }
Non je ne veux pas colorier une ligne sur deux.
Je vais essayer de reformuler mon problème.
Je veux avec une seule requête avoir un tableau à double entrée avec :
- En colonne les mois
- En ligne les articles
J'effectue donc la requête ci-dessous :
Elle me permet d'avoir en ligne les mois articles et total des ventes, exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <?php $retour_vente_mois = mysql_query(" SELECT SUM(quantite) AS somme, article, MONTH(c.date_commande) as mois FROM commande_detail cd JOIN commande c ON cd.num_cmde=c.num JOIN article a ON cd.article=a.id_article WHERE YEAR(c.date_commande)='$annee_rch' GROUP BY article, MONTH(c.date_commande) ORDER BY article, MONTH(c.date_commande) ");?>
article1;mois1;total_article1_mois1
article1;mois2;total_article1_mois2
article1;mois8;total_article1_mois8
article2;mois2;total_article2_mois2
article2;mois3;total_article2_mois3
Je souhaite donc mettre en forme le résultat ci-dessous dans mon tableau à double entré.
C'est pou cela que je voulais tester le dernier et avantdernier résultat.
Si c'est le même article je reste sur la même ligne sinon je saute une ligne.
Pareil pour les mois si mois 1 alors je créé une cellule, mais le problème c'est qu'il peut pour un mois ne pas y avoir de vente et donc pas de ligne généré et donc pas cellule créé et donc cela me créé un décalage.
J'espère que je suis clair mais ça c'est pas gagné....
Merci encore de ton aide !
Bonjour,
Je n'ai absolument rien compris à ton soucis si ce n'est que tu veux tester les derniers et avants derniers membres d'un tableau.
Tableau que tu veux à deux dimensions n'est ce pas ?
bref
$current contient la dernière ligne de ton tableau PHP.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 $array = array(..... some elements); end($array); $current = current($array); $prev = prev($array);
$prev contient l'avant dernière ligne.
Mais je pense que tu pourrais tout simplifier en réfléchissant bien à la conception de ton programme... si tu as besoin de ce coté là, n'hésite pas, sinon à moins de nous expliquer plus clairement, je ne pense pas que nous puissions t'aider correctement.
Merci pour ton aide.
Oui effectivement je veux faire un tableau à double entrée (état des ventes) avec en ligne les articles et en colonne les mois.
Avec donc pour chaque aticle le nombre vendu par mois.
Mes donées sont stockées dans une base de données Mysql, cette table contient le champ article et date de commande.
Actuellement j'y arrive mais en faisant une boucle liser les articles.
Dans celle ci je liste les mois.
Et dans cette dernière je fais le total des ventes par article et par mois.
Donc le nombre de requête est égal au nbre d'article* nbre de mois.
Je souhaite donc faire cela en une seule requête, afin de limiter les temps de réponse.
En ésperante être clair....
Merci encore pour votre aide.
Au final, tu veux donc, simplement, le nombre d'articles vendus par mois, et ceci en détail, donc par article
Si c'est bien ça, et que tu peux retoucher à la structure de ta base de données je te conseillerai d'avoir 2 tables:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 article 1 , vendu x fois le mois y de l'année z article 2 , vendu x fois le mois y de l'année z article 3 , vendu x fois le mois y de l'année z...
Une pour les articles que l'on va nommer articles(original): id_article, nom_article, desc_article... ce que tu veux mais une ID en key
Une pour les ventes que l'on va nommer ventes(originalité quand tu nous tient): id_vente, id_article, date_vente puis ce que tu veux.
Après:
Que l'on me corrige si je me trompe mais ça devrait fonctionner.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT articles.nom_articles, count(ventes.id_vente) FROM articles LEFT JOIN ventes ON articles.id_article = ventes.id_article WHERE (YEAR(ventes.date_vente) = ?) GROUP BY ventes.id_article, MONTH(ventes.date_vente)
Merci de ton aide.
J'ai bien une table base_article.
Pour info j'ai une table entete commande (n° de commande,nom du client et date de commande)
Et j'ai aussi une table detail commande (n° de commande, article et quantité)
Avec ma requête que j'ai posté s le maessage precedent j'arrive à avoir le résultat que tu obtiens , je la reposte :
Donc pas de soucis, j'ai bien :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 <?php $retour_vente_mois = mysql_query("SELECT SUM(quantite) AS somme,article, MONTH(c.date_commande) as mois FROM commande_detail cd JOIN commande c ON cd.num_cmde=c.num JOIN article a ON cd.article=a.id_article WHERE YEAR(c.date_commande)='$annee_rch' GROUP BY article, MONTH(c.date_commande) ORDER BY article, MONTH(c.date_commande)");?>
Mois1; article 2; totalvente 3;
Le problème se pose sur la mise en forme de ces résultats
En effet je souhaite comme vous le savez faire apparaitre ces résultats sous forme de tableau à double entré, la ligne d'entête serait :
Article;Janvier;Févier;...;Décembre
La ligne 1 serait :
Article1; Total Janvier;Total Février;..;Total Décembre
Voili voilou !
Merci encore !
Ceci réponds donc à ta question ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 <?php // ton tableau doit ressembler à quelque chose comme ça: $articles = array( 0 => array('id_article' => 14, 'mois_article' => 7, 'ventes_article' => 2457), 1 => array('id_article' => 32, 'mois_article' => 7, 'ventes_article' => 1452), 2 => array('id_article' => 57, 'mois_article' => 7, 'ventes_article' => 875), 3 => array('id_article' => 14, 'mois_article' => 8, 'ventes_article' => 2452), 4 => array('id_article' => 32, 'mois_article' => 8, 'ventes_article' => 124), 2 => array('id_article' => 57, 'mois_article' => 8, 'ventes_article' => 875), ); // Et voilà de quoi l'afficher. echo '<table>'; while (list($article_id, $article_contenu) = each($articles)) { // -> là tu as les lignes echo '<tr>'; while (list($mois_id, $mois_contenu) = each($article_contenu)) { //-> là tu as les colonnes. echo '<td>'; echo 'les informations que tu veux afficher.'; echo '</td>'; } echo '</tr>'; } echo '</table>'; ?>
[edit]Mise à jour[/edit]
Alors il faut que je teste, ça va prendre un peu de temps.
Pour faire cela tu mets les résultats de ma requête dans un aray c'est cela ?
Par contre si pour un mois il n'y a pas eu de vente, ça va passer directement au mois suivant et ça va créer un décalage non ?
Merci encore !
Bien tu met une simple condition
Formes idéale du tableau
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if ($articles[$article_id]['article_ventes'] ===0) ...
En PHP l'utilisation des tableaux est... obligatoire, c'est une des choses basiques et des plus utiles/puissantes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 <?php $articles = array( // id_article => infos 24 => array( // id_mois => nombres de ventes 11 => 2547, 10 => 1257, 9 => 541, ), 23 => array( 11 => 1755, 10 => 14257, 9 => 557, ), ); // Pour accéder aux ventes d'un article pour un mois donné: $nb_ventes = $articles[$id_article][$id_mois]; ?>
Ok, merci beaucoup.
Bon je suis un peu un boulet j'ai encore deux ou trois questions/problèmes :
Quand tu parles de l'utilisation des tableaux c'est des arrays, on est d'accord ? Moi j'utilise que des boucles pour lister les données de mes tables c'est pareil non ?
Ou alors est ce que je dois mettre les résultats de cette boucle dans un tableau ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <?php while ($donnees_vente_mois = mysql_fetch_array($retour_vente_mois)) { } ?>
Car j'ai essayé ça mais après je ne sais que faire :
Merci encore (et oui encore...lol)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 $tableau = array(); while ($donnees_vente_mois = mysql_fetch_array($retour_vente_mois)) { $tableau['article'] = $donnees_vente_mois['article']; $tableau['mois'] = $donnees_vente_mois['mois']; $tableau['somme'] = $donnees_vente_mois['somme']; echo $tableau['article'].';'.$tableau['mois'].';'.$tableau['somme'].'<br>'; }
L'idéal est de tout stocker dans un tableau php, un vrai, donc un array().
Ensuite, pour éxplorer les tableaux, dans mon code tu as un éxemple:
Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 while (list($key,$value) = earch($array)) { // ici $key est la clé de la ligne courante du tableau // et $value est la valeur de cette ligne(qui peut être, elle même un tableau } // plus simple, tu as la fonction foreach mais qui a des performances moins bonnes: foreach($array as $key=>$value) { // ici $key est la clé de la ligne courante du tableau // et $value est la valeur de cette ligne(qui peut être, elle même un tableau }
Seules la syntaxe et la performance changent.
Avec ça tu peux explorer un tableau et donc accéder aux informations que tu souhaite facilement et rapidement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 while (list($id_article,$value) = each($articles)) { //ici ce sont les lignes => <tr> while (list($id_mois, $ventes) = each($value)) { // ici ce sont les colonnes. <td> if ($ventes ===0) continue; else { // tu affiche. } // ici ce sont les fin de colonnes. </td> } //ici ce sont les fin de lignes => </tr> }
Re,
Voilà ce que j'ai réussi à faire (autant dire que ça ne marche pas)
On est d'accord que $donnees_vente_mois est un array ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 <?php while ($donnees_vente_mois = mysql_fetch_array($retour_vente_mois)) { while (list($id_article,$value) = each($donnees_vente_mois)) { echo '<tr>'; while (list($id_mois, $ventes) = each($donnees_vente_mois)) { echo '<td>'; if ($ventes ===0) continue; else { echo $donnees_vente_mois['somme']; } echo '</td>'; } echo '</tr>'; } } ?>
Et a quoi correspond $id_article et $value car je le les ai jamis définie ?
Enfin bref, le rpoblème est que tout s'affcihe sur la même ligne et plusieurs doublons apparaissent.
J'essaye de regarder ça, si tu as une idée ?
Merci encore mille fois !
Stock dans un tableau après avoir mis sous la forme que tu veux, l'idéal c'est
$articles[$id_article][$id_mois]
et cette variable te donne une valeur numérique qui est le nombre de vente.
Donc, dans u n premier temps, tu récupère les infos via MySQL, dans un second temps tu stock dans un tableau en le formatant comme dit plus haut, puis tu l'éxplore et l'affiche.
Donc:
while($array = mysql_fetch_array($machin)) {
$id_article = $array[// champs contenant l'id de l'article];
$id_mois = array[//champs contenant l'id du mois];
$vente = $array[//nombre de vente pour l'article et le mois donné];
$articles[$id_article][$id_mois] = $vente;
}
Maintenant, tu as définis ton tableau, puis tu l'explore comme je t'ai montré dans les messages précédents.
Bon je suis en train de reprendre avec un exemple à priori simple :
Je souhaite liste la liste des produits commandes par famille.
Je souhaite que mon tableau soit en ligne avec :
FAMILLE1
Liste des produits de la famille1
FAMILLE2
Liste des produits de la famille2
Comment faire cela en un seule requête, car moi j'en fait deux je liste les familles puis les produits de la famille.
Voici mon code avec une seule requête :
Merci d'avance de ton aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 <?php //Je vais chercher les informtions de la commande $retour_detail = mysql_query(" SELECT * FROM commande_detail cd JOIN article a ON a.id_article=cd.article WHERE num_cmde='$num_cmde'"); while ($donnees_detail = mysql_fetch_array($retour_detail)) { ?> <tr> <td colspan="3"><?php echo $donnees_detail['groupe_stat'].' | '.$donnees_detail['article']; ?></td> </tr> <?php } ?>
Fait simplement une jointure:
SELECT table1.champs1, table1.champs2, table2.champs FROM table1 LEFT JOIN table2 ON table1.champs1 = table2.champs1
N'utilise pas la sélection des champs via *, spécifies les champs que tu vas utiliser, ne prend jamais tout les champs sauf si tu les utilises tous.
SELECT leschamps FROM latable LEFT JOIN seconde_table ON table1.champs_de_liaison = table2.champs_de_liaison WHERE....
Partager