[PHP] Fusionner 2 tableaux
Fermé
mtardieu
Messages postés
15
Date d'inscription
lundi 2 juillet 2012
Statut
Membre
Dernière intervention
3 juillet 2012
-
2 juil. 2012 à 12:55
zolani2 Messages postés 1 Date d'inscription mardi 3 juillet 2012 Statut Membre Dernière intervention 3 juillet 2012 - 3 juil. 2012 à 14:23
zolani2 Messages postés 1 Date d'inscription mardi 3 juillet 2012 Statut Membre Dernière intervention 3 juillet 2012 - 3 juil. 2012 à 14:23
A voir également:
- [PHP] Fusionner 2 tableaux
- Fusionner 2 tableaux excel - Guide
- Comment fusionner 2 pdf - Guide
- Fusionner 2 cellules excel - Guide
- Tableaux croisés dynamiques - Guide
- 2 ecran pc - Guide
6 réponses
mpmp93
Messages postés
6648
Date d'inscription
mercredi 13 avril 2011
Statut
Membre
Dernière intervention
28 septembre 2015
1 339
2 juil. 2012 à 13:36
2 juil. 2012 à 13:36
Bonjour,
J'ai une classe Html qui fait ça:
et qui en sortie me restitue ça:
mais le code de cette classe HTML est trop long pour être collé ici...
A+
J'ai une classe Html qui fait ça:
require_once 'inc/Html.class.php'; $Html = new Html('UTF-8'); $Html->setTheadValues(array('AeRE','AeTM','CMT','ARD')); $values = array( array(1,'AeRE',362), array(1,'AeTM',569), array(1,'CMT',6), array(2,'AeRE',90), array(2,'AeTM',55), array(2,'ARD',20), array(2,'CMT',4), array(3,'AeRE',34), array(3,'AeTM',51), ); $Html->setTableValues($values); $Html->table();
et qui en sortie me restitue ça:
<table> <thead> <tr> <td> </td> <td>AeRE</td> <td>AeTM</td> <td>CMT</td> <td>ARD</td> <td>TOT</td> </tr> </thead> <tbody> <tr> <td>1</td><td>362</td><td>569</td><td>6</td><td> </td><td>937</td> </tr> <tr> <td>2</td><td>90</td><td>55</td><td>4</td><td>20</td><td>169</td> </tr> <tr> <td>3</td><td>34</td><td>51</td><td> </td><td> </td><td>85</td> </tr> </tbody> <tfoot> <tr> <td>CUMUL</td> <td>486</td><td>675</td><td>10</td><td>20</td><td>1191</td> </tr> </tfoot> </table>
mais le code de cette classe HTML est trop long pour être collé ici...
A+
JooS
Messages postés
2468
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
228
2 juil. 2012 à 15:46
2 juil. 2012 à 15:46
Salut !
La requête ?!
T'utilise des jointures ou pas ?
La requête ?!
T'utilise des jointures ou pas ?
mtardieu
Messages postés
15
Date d'inscription
lundi 2 juillet 2012
Statut
Membre
Dernière intervention
3 juillet 2012
2 juil. 2012 à 15:51
2 juil. 2012 à 15:51
Voici ma requête :
$result=mysql_query("
SELECT 'Team' , 'Product' , COUNT(*) AS nb_article FROM 'article_database'WHERE 'Team'IN ('AB1','AB2','PNE') AND 'Product'IN ('AeRE', 'AeTM','ARD','CMT')
GROUP BY 'Team' , 'Product'
")
while($r[]=mysql_fetch_array($result_test));
Ensuite j'ai
$r[0][0] = 'AB1'
$r[0][1] = 'AeRE'
$r[0][0] = '362'
$r[1][0] = 'AB1'
$r[1][1] = 'AeTM'
$r[1][0] = '569'
etc.
$result=mysql_query("
SELECT 'Team' , 'Product' , COUNT(*) AS nb_article FROM 'article_database'WHERE 'Team'IN ('AB1','AB2','PNE') AND 'Product'IN ('AeRE', 'AeTM','ARD','CMT')
GROUP BY 'Team' , 'Product'
")
while($r[]=mysql_fetch_array($result_test));
Ensuite j'ai
$r[0][0] = 'AB1'
$r[0][1] = 'AeRE'
$r[0][0] = '362'
$r[1][0] = 'AB1'
$r[1][1] = 'AeTM'
$r[1][0] = '569'
etc.
mtardieu
Messages postés
15
Date d'inscription
lundi 2 juillet 2012
Statut
Membre
Dernière intervention
3 juillet 2012
2 juil. 2012 à 15:52
2 juil. 2012 à 15:52
Tous les paramètres dépendent en réalité de variables, par exemple à la place de Team et Product ça peut être autre chose (idem pour les conditions). J'ai simplifié la requête pour travailler sur un champ réduit d'articles
JooS
Messages postés
2468
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
228
Modifié par JooS le 2/07/2012 à 16:24
Modifié par JooS le 2/07/2012 à 16:24
Hmmm ok !
C'est pas comme ça qu'on fait du tout !
En base de données, il existe un principe qui s'appele "Jointure", ça te permet de relier des tables entre elles selon des conditions !
Or, au lieu de stocker tout dans une seule table, on sépare les informations sur plusieurs tables, tout en restant logique en ce qui concerne les relations !
Dans ton cas !
Tu peux créer trois tables ...
Si on en reste la, on a séparer(décomposer) les informations, mais on a créer aucune relation entre elles !
Donc on ajoute une quatrième table qui representera la relation(les liens) entre les 3 dernières tables ...
Dans la table relation, par exemple, le tuple suivant signifiera !
L'équipe dont l'id est 1 a créer l'article 6 qui parle du produit 2 !
Requête !
C'est la qu'entre le principe des jointures, qui est l'opposé de ce qu'on avait fait, or, la décomposition !
- Le RIGHT JOIN signifie que si in n'y a aucun tuple qui vérifie la condition de jointure, alors on mets 0 dans l'attribut virtuel "Nombre article" ...
Si la condition n'est pas vérifié, ça veut dire qu'il n'y a aucun article écrit par une équipe A concernant un produit B, donc on mets 0, et je pense que c'est ce que tu cherchais a faire !
Remarque :
Tout les id sont des clé primaires en auto-increment !
Tout les attributs de la table relations sont des clé primaires !
Voila, j'ai pas essayer, donc si tu trouve des erreurs, note les !
C'est pas comme ça qu'on fait du tout !
En base de données, il existe un principe qui s'appele "Jointure", ça te permet de relier des tables entre elles selon des conditions !
Or, au lieu de stocker tout dans une seule table, on sépare les informations sur plusieurs tables, tout en restant logique en ce qui concerne les relations !
Dans ton cas !
Tu peux créer trois tables ...
equipes(id, nom) produits(id, reference) article(id, contenu)
Si on en reste la, on a séparer(décomposer) les informations, mais on a créer aucune relation entre elles !
Donc on ajoute une quatrième table qui representera la relation(les liens) entre les 3 dernières tables ...
relation(id_equipe, id_produit, id_article)
Dans la table relation, par exemple, le tuple suivant signifiera !
relation ( 3, 2, 6)
L'équipe dont l'id est 1 a créer l'article 6 qui parle du produit 2 !
Requête !
C'est la qu'entre le principe des jointures, qui est l'opposé de ce qu'on avait fait, or, la décomposition !
SELECT eq.nom, prod.reference, COUNT(*) AS [Nombre article] FROM equipes eq INNER JOIN relation r ON eq.id = r.id_equipe INNER JOIN produits prod ON prod.id = r.id_produit RIGHT JOIN article art ON art.id = r.id_article GROUP BY eq.nom, prod.reference
- Le RIGHT JOIN signifie que si in n'y a aucun tuple qui vérifie la condition de jointure, alors on mets 0 dans l'attribut virtuel "Nombre article" ...
Si la condition n'est pas vérifié, ça veut dire qu'il n'y a aucun article écrit par une équipe A concernant un produit B, donc on mets 0, et je pense que c'est ce que tu cherchais a faire !
Remarque :
Tout les id sont des clé primaires en auto-increment !
Tout les attributs de la table relations sont des clé primaires !
Voila, j'ai pas essayer, donc si tu trouve des erreurs, note les !
mpmp93
Messages postés
6648
Date d'inscription
mercredi 13 avril 2011
Statut
Membre
Dernière intervention
28 septembre 2015
1 339
Modifié par baladur13 le 30/07/2015 à 23:58
Modifié par baladur13 le 30/07/2015 à 23:58
Bonjour mtardieu
Votre requête est OK:
$result=mysql_query("
SELECT 'Team' , 'Product' , COUNT(*) AS nb_article FROM 'article_database'WHERE 'Team'IN ('AB1','AB2','PNE') AND 'Product'IN ('AeRE', 'AeTM','ARD','CMT')
GROUP BY 'Team' , 'Product'
")
while($r[]=mysql_fetch_array($result_test));
Avec ma classe $Html vous n'avez besoin de rien d'autre....
A+
Votre requête est OK:
$result=mysql_query("
SELECT 'Team' , 'Product' , COUNT(*) AS nb_article FROM 'article_database'WHERE 'Team'IN ('AB1','AB2','PNE') AND 'Product'IN ('AeRE', 'AeTM','ARD','CMT')
GROUP BY 'Team' , 'Product'
")
while($r[]=mysql_fetch_array($result_test));
Avec ma classe $Html vous n'avez besoin de rien d'autre....
A+
mtardieu
Messages postés
15
Date d'inscription
lundi 2 juillet 2012
Statut
Membre
Dernière intervention
3 juillet 2012
2 juil. 2012 à 16:21
2 juil. 2012 à 16:21
Ok merci.
Je vais essayer ça et je reviendrais vers toi. Le seul problème, c'est que jvais avoir une vingtaine de tables avec beaucoup de valeurs ^^
Je vais essayer ça et je reviendrais vers toi. Le seul problème, c'est que jvais avoir une vingtaine de tables avec beaucoup de valeurs ^^
JooS
Messages postés
2468
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
228
2 juil. 2012 à 16:25
2 juil. 2012 à 16:25
Une vingtaine ?!!
Comment ça !!
Comment ça !!
mtardieu
Messages postés
15
Date d'inscription
lundi 2 juillet 2012
Statut
Membre
Dernière intervention
3 juillet 2012
2 juil. 2012 à 17:08
2 juil. 2012 à 17:08
En fait je pense qu'on se comprend mal. C'est pas évident d'expliquer son problème :)
Tu peux voir ici 15 lignes tirées au hasard de ma base de données (J'ai en tout plus de 9000 lignes sous le même format). Pour faciliter la compréhension, je me suis arrêté à la colonne "sev" mais il y en a encore une dixaine derrière.
http://tinypic.com/images/goodbye.jpg
Donc en gros, j'ai mes données dans une bonne centaine de feuilles excels (une par semaine et par équipe) et je nourris ma base de données avec ces feuilles.
Chaque ligne contient beaucoup de données, rentrées par les user comme Product, Release, Phase, Sev etc.
Je devrais pouvoir ensuite faire n'importe quelle requête, comme compter le nombre d'article par release et par team. Ou par phase et par produit etc.
Tu peux voir ici 15 lignes tirées au hasard de ma base de données (J'ai en tout plus de 9000 lignes sous le même format). Pour faciliter la compréhension, je me suis arrêté à la colonne "sev" mais il y en a encore une dixaine derrière.
http://tinypic.com/images/goodbye.jpg
Donc en gros, j'ai mes données dans une bonne centaine de feuilles excels (une par semaine et par équipe) et je nourris ma base de données avec ces feuilles.
Chaque ligne contient beaucoup de données, rentrées par les user comme Product, Release, Phase, Sev etc.
Je devrais pouvoir ensuite faire n'importe quelle requête, comme compter le nombre d'article par release et par team. Ou par phase et par produit etc.
JooS
Messages postés
2468
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
228
Modifié par JooS le 2/07/2012 à 19:28
Modifié par JooS le 2/07/2012 à 19:28
Hmmm je vois !
Le fait d'avoir plusieurs attributs n'implique pas que tu dois créer plusieurs tables !
Par exemple, les attributs "year" et "week", je suppose que c'est l'année et la semaine de production d'un produit, donc ils concernent les produits, et sachant que chaque produit possède une seule date de production, dans ce cas, l'attribut "year" et "week" doivent se trouver dans la table "produits" !
Tu dois savoir un truc a propos des relations, ou plus précisément "les cardinalités" !
En général, on a les cardinalités "1:N" et "1:1" !
Exemple !
personne(id, nom, prenom, adresse)
On peut décomposer cette relation en deux sous-tables, ça donnerai !
personne_identite (id, nom, prenom)
personne_infos (id_personne, adresse)
Si tu remarque bien, la cardinalité entre les deux tables est "1:1", qui veut dire qu'on peut trouver qu'un seul tuple dans la table "personne_infos" qui peut être relier avec un tuple de la table "personne_identite", ou qu'on peut trouver qu'une seule adresse pour une personne donnée, donc le fait d'avoir procéder a la décomposition de la table "personne" était inutile, car "id" identifie "nom" et "prenom", mais aussi "adresse" ...
Remarque : identifie veut dire qu'a partir de tel attribut "A" on peut trouver qu'un seul tuple, donc on peut identifier le tuple !
Dans ce cas, on dis que "A" est une clé primaire, sinon candidate !
Exemple 2 !
personne(id, nom, prenom, telephone)
Si on laisse comme ça, on remarque qu'une personne peut avoir plusieurs numéro de téléphone, donc "id" n'identifie pas "telephone", car on peut trouver 2 ou plusieurs numéro de téléphone pour une seule personne donnée !
alors la, une décomposition serait la bienvenue !
personne(id, nom, prenom)
personne_phone(id, id_personne, telephone)
La cardinalité entre les deux relations est de "1:N" !
Voila, donc a toi de voir si la attributs que tu va sortir de ta relation mère vont engendrer des relations dont les cardinalités seraient "1:N" ou "1:1", si c'est "1:1", alors c'est pas la peine de faire sortir les attributs concerné de ta table initial !
Le fait d'avoir plusieurs attributs n'implique pas que tu dois créer plusieurs tables !
Par exemple, les attributs "year" et "week", je suppose que c'est l'année et la semaine de production d'un produit, donc ils concernent les produits, et sachant que chaque produit possède une seule date de production, dans ce cas, l'attribut "year" et "week" doivent se trouver dans la table "produits" !
Tu dois savoir un truc a propos des relations, ou plus précisément "les cardinalités" !
En général, on a les cardinalités "1:N" et "1:1" !
Exemple !
personne(id, nom, prenom, adresse)
On peut décomposer cette relation en deux sous-tables, ça donnerai !
personne_identite (id, nom, prenom)
personne_infos (id_personne, adresse)
Si tu remarque bien, la cardinalité entre les deux tables est "1:1", qui veut dire qu'on peut trouver qu'un seul tuple dans la table "personne_infos" qui peut être relier avec un tuple de la table "personne_identite", ou qu'on peut trouver qu'une seule adresse pour une personne donnée, donc le fait d'avoir procéder a la décomposition de la table "personne" était inutile, car "id" identifie "nom" et "prenom", mais aussi "adresse" ...
Remarque : identifie veut dire qu'a partir de tel attribut "A" on peut trouver qu'un seul tuple, donc on peut identifier le tuple !
Dans ce cas, on dis que "A" est une clé primaire, sinon candidate !
Exemple 2 !
personne(id, nom, prenom, telephone)
Si on laisse comme ça, on remarque qu'une personne peut avoir plusieurs numéro de téléphone, donc "id" n'identifie pas "telephone", car on peut trouver 2 ou plusieurs numéro de téléphone pour une seule personne donnée !
alors la, une décomposition serait la bienvenue !
personne(id, nom, prenom)
personne_phone(id, id_personne, telephone)
La cardinalité entre les deux relations est de "1:N" !
Voila, donc a toi de voir si la attributs que tu va sortir de ta relation mère vont engendrer des relations dont les cardinalités seraient "1:N" ou "1:1", si c'est "1:1", alors c'est pas la peine de faire sortir les attributs concerné de ta table initial !
mtardieu
Messages postés
15
Date d'inscription
lundi 2 juillet 2012
Statut
Membre
Dernière intervention
3 juillet 2012
3 juil. 2012 à 10:11
3 juil. 2012 à 10:11
Merci Joos,
Je connais bien les relations entre les tables mais ceci ne s'applique pas dans mon cas.
En fait les données que je traite sont à chaque fois des lignes d'un tableau excel, uniques, et aucune relation ne peut être faite entre elles.
Si ce n'est qu'une ligne d'un tableau concerne forcément une année et une semaine particulière. Mais aucune dépendance entre les produits, les équipes ou toutes les autres données présentes.
Je n'ai pas réussi à trouver de solutions pour avoir des 0 sans faire appel à une autre table, ce qui est logique.
J'ai en revanche pu trouver une solution qui permet de remplir un autre tableau avec des 0.
En fait j'ai mon premier tableau r :
$r = array(
array(1,'AeRE',362),
array(1,'AeTM',569),
array(1,'CMT',6),
array(2,'AeRE',90),
array(2,'AeTM',55),
array(2,'ARD',20),
array(2,'CMT',4),
array(3,'AeRE',34),
array(3,'AeTM',51),
);
Et je fais deux boucles
Si il y a match du nom de team et de product, il récupère la valeur, sinon il récupère 0 et fait un offset, ce qui permet par exemple d'avoir s[8][2] = r[6][2] pour un offset de 2 et donc de remplir un tableau plus grand que le tableau initial =)
Je connais bien les relations entre les tables mais ceci ne s'applique pas dans mon cas.
En fait les données que je traite sont à chaque fois des lignes d'un tableau excel, uniques, et aucune relation ne peut être faite entre elles.
Si ce n'est qu'une ligne d'un tableau concerne forcément une année et une semaine particulière. Mais aucune dépendance entre les produits, les équipes ou toutes les autres données présentes.
Je n'ai pas réussi à trouver de solutions pour avoir des 0 sans faire appel à une autre table, ce qui est logique.
J'ai en revanche pu trouver une solution qui permet de remplir un autre tableau avec des 0.
En fait j'ai mon premier tableau r :
$r = array(
array(1,'AeRE',362),
array(1,'AeTM',569),
array(1,'CMT',6),
array(2,'AeRE',90),
array(2,'AeTM',55),
array(2,'ARD',20),
array(2,'CMT',4),
array(3,'AeRE',34),
array(3,'AeTM',51),
);
Et je fais deux boucles
for ($m=0;$m < $count_team;$m++) { for ($k=0;$k < $count_product;$k++) { if ($r[$row][0]==${team.$m} and $r[$row][1]==${product.$k}) { $s[$row+$offset][0]=${team.$m}; $s[$row+$offset][1]=${product.$k}; $s[$row+$offset][2]=$r[$row][2]; $row++; } else { $s[$row+$offset][0]=${team.$m}; $s[$row+$offset][1]=${product.$k}; $s[$row+$offset][2]=0; $offset++; } } }
Si il y a match du nom de team et de product, il récupère la valeur, sinon il récupère 0 et fait un offset, ce qui permet par exemple d'avoir s[8][2] = r[6][2] pour un offset de 2 et donc de remplir un tableau plus grand que le tableau initial =)
aladin07
Messages postés
277
Date d'inscription
vendredi 13 avril 2012
Statut
Membre
Dernière intervention
30 septembre 2012
30
3 juil. 2012 à 02:30
3 juil. 2012 à 02:30
Alors ma solution est la suivante:
Donc mantenant tu as: $complete[1]['AeRE'] qui affiche 362 et $complete[3]['CMT'] qui affiche 0
J'espère que ça t'as aidé.
<?php // Ta liste des COUNT, j'assume qu'elle est de cette manière $list = array( '1 AeRE 362 ', '1 AeTM 569 ', '1 CMT 6 ', '2 AeRE 90 ', '2 AeTM 55 ', '2 ARD 20 ', '2 CMT 4 ', '3 AeRE 34 ', '3 AeTM 51 ' ); // Liste des produits $produits = array('AeRE', 'AeTM', 'ARD', 'CMT'); $nbr_produits = count($produits); // Nombre d'équipes $equipes = 3; $complete = array(); for($i=0, $j=0 , $v=1; $i < $equipes * $nbr_produits; $i++, $j++) { // Si l'équipe n'est pas présente dans le tableau on la crée // puis on associe à l'equipe 4 produits par defauts autant // qu'index et 0 comme nombre d'articles if( ! isset($complete[$v])) { $complete[$v] = array_combine($produits, array_fill(0, 4, 0)); } if(isset($list[$j]) AND preg_match('~(?:['.$v.'])[\s+]([a-z]+)[\s+]([0-9]+)[\s+]$~i', $list[$j], $matches)) { $article = $matches[1]; $nombre = $matches[2]; $complete[$v][$article] = (int)$nombre; } else $j--; ! (($i+1) % $nbr_produits) AND $v++; }
Donc mantenant tu as: $complete[1]['AeRE'] qui affiche 362 et $complete[3]['CMT'] qui affiche 0
J'espère que ça t'as aidé.
mtardieu
Messages postés
15
Date d'inscription
lundi 2 juillet 2012
Statut
Membre
Dernière intervention
3 juillet 2012
3 juil. 2012 à 10:13
3 juil. 2012 à 10:13
Merci pour ta solution aladin, je pense que c'est très efficace, mais j'aurais du mal à expliquer certaines parties, notamment celle ci :
Je dois en effet livrer un code simple et compréhensible, donc j'ai trouvé une autre solution qui consiste à faire ceci :
Si il y a match du nom de team et de product, il récupère la valeur, sinon il récupère 0 et fait un offset, ce qui permet par exemple d'avoir s[8][2] = r[6][2] pour un offset de 2 et donc de remplir un tableau plus grand que le tableau initial =)
Je pense que c'est plus simple et plus facile à expliquer.
Merci encore de votre aider.
if(isset($list[$j]) AND preg_match('~(?:['.$v.'])[\s+]([a-z]+)[\s+]([0-9]+)[\s+]$~i', $list[$j], $matches))
Je dois en effet livrer un code simple et compréhensible, donc j'ai trouvé une autre solution qui consiste à faire ceci :
for ($m=0;$m < $count_team;$m++) { for ($k=0;$k < $count_product;$k++) { if ($r[$row][0]==${team.$m} and $r[$row][1]==${product.$k}) { $s[$row+$offset][0]=${team.$m}; $s[$row+$offset][1]=${product.$k}; $s[$row+$offset][2]=$r[$row][2]; $row++; } else { $s[$row+$offset][0]=${team.$m}; $s[$row+$offset][1]=${product.$k}; $s[$row+$offset][2]=0; $offset++; } } }
Si il y a match du nom de team et de product, il récupère la valeur, sinon il récupère 0 et fait un offset, ce qui permet par exemple d'avoir s[8][2] = r[6][2] pour un offset de 2 et donc de remplir un tableau plus grand que le tableau initial =)
Je pense que c'est plus simple et plus facile à expliquer.
Merci encore de votre aider.
mpmp93
Messages postés
6648
Date d'inscription
mercredi 13 avril 2011
Statut
Membre
Dernière intervention
28 septembre 2015
1 339
Modifié par mpmp93 le 3/07/2012 à 13:38
Modifié par mpmp93 le 3/07/2012 à 13:38
Bonjour,
Toujours pas eu votre mail en MP...
Ma classe HTML()
vous sors ceci:
<table><thead><tr><td/><td>AeRE</td><td>AeTM</td><td>CMT</td><td>ARD</td><td>TOT</td></tr></thead><tbody><tr><td>1</td><td>362.3</td><td>569.05</td><td>6</td><td> </td><td>937.35</td></tr><tr><td>2</td><td>90</td><td>55</td><td>4</td><td>20</td><td>169</td></tr><tr><td>3</td><td>34</td><td>51</td><td> </td><td> </td><td>85</td></tr></tbody><tfoot><tr><td>CUMUL</td><td>486.3</td><td>675.05</td><td>10</td><td>20</td><td>1191.35</td></tr></tfoot></table>
Une table en données croisées avec des cases vides à la place des zéros
Variante:
vous sors ceci:
<table><thead><tr><td/><td>AeRE</td><td>AeTM</td><td>CMT</td><td>ARD</td><td>TOT</td></tr></thead><tbody><tr><td>1</td><td>362.3</td><td>569.05</td><td>6</td><td>0</td><td>937.35</td></tr><tr><td>2</td><td>90</td><td>55</td><td>4</td><td>20</td><td>169</td></tr><tr><td>3</td><td>34</td><td>51</td><td>0</td><td>0</td><td>85</td></tr></tbody><tfoot><tr><td>CUMUL</td><td>486.3</td><td>675.05</td><td>10</td><td>20</td><td>1191.35</td></tr></tfoot></table>
la même table avec les cases vides remplacées par des zéros
et variante:
vous sors ceci:
<table><thead><tr><td/><td>AeRE</td><td>AeTM</td><td>CMT</td><td>ARD</td><td>TOT</td></tr></thead><tbody><tr><td>1</td><td>362.30</td><td>569.05</td><td>6.00</td><td>0.00</td><td>937.35</td></tr><tr><td>2</td><td>90.00</td><td>55.00</td><td>4.00</td><td>20.00</td><td>169.00</td></tr><tr><td>3</td><td>34.00</td><td>51.00</td><td>0.00</td><td>0.00</td><td>85.00</td></tr></tbody><tfoot><tr><td>CUMUL</td><td>486.30</td><td>675.05</td><td>10.00</td><td>20.00</td><td>1191.35</td></tr></tfoot></table>
toujours la même table, mais avec les données formatées
Si vous me contactez pas, pas de code....
A+
Toujours pas eu votre mail en MP...
Ma classe HTML()
$Html->setTheadValues(array('AeRE','AeTM','CMT','ARD')); $values = array( array(1,'AeRE',362.3), array(1,'AeTM',569.05), array(1,'CMT',6), array(2,'AeRE',90), array(2,'AeTM',55), array(2,'ARD',20), array(2,'CMT',4), array(3,'AeRE',34), array(3,'AeTM',51), ); // $Html->setZeroValue('0'); $Html->setTableValues($values); // $Html->setTdFormat('%01.2f'); $Html->table();
vous sors ceci:
<table><thead><tr><td/><td>AeRE</td><td>AeTM</td><td>CMT</td><td>ARD</td><td>TOT</td></tr></thead><tbody><tr><td>1</td><td>362.3</td><td>569.05</td><td>6</td><td> </td><td>937.35</td></tr><tr><td>2</td><td>90</td><td>55</td><td>4</td><td>20</td><td>169</td></tr><tr><td>3</td><td>34</td><td>51</td><td> </td><td> </td><td>85</td></tr></tbody><tfoot><tr><td>CUMUL</td><td>486.3</td><td>675.05</td><td>10</td><td>20</td><td>1191.35</td></tr></tfoot></table>
Une table en données croisées avec des cases vides à la place des zéros
Variante:
$Html->setZeroValue('0'); $Html->setTableValues($values); // $Html->setTdFormat('%01.2f'); $Html->table();
vous sors ceci:
<table><thead><tr><td/><td>AeRE</td><td>AeTM</td><td>CMT</td><td>ARD</td><td>TOT</td></tr></thead><tbody><tr><td>1</td><td>362.3</td><td>569.05</td><td>6</td><td>0</td><td>937.35</td></tr><tr><td>2</td><td>90</td><td>55</td><td>4</td><td>20</td><td>169</td></tr><tr><td>3</td><td>34</td><td>51</td><td>0</td><td>0</td><td>85</td></tr></tbody><tfoot><tr><td>CUMUL</td><td>486.3</td><td>675.05</td><td>10</td><td>20</td><td>1191.35</td></tr></tfoot></table>
la même table avec les cases vides remplacées par des zéros
et variante:
$Html->setZeroValue('0'); $Html->setTableValues($values); // $Html->setTdFormat('%01.2f'); $Html->table();
vous sors ceci:
<table><thead><tr><td/><td>AeRE</td><td>AeTM</td><td>CMT</td><td>ARD</td><td>TOT</td></tr></thead><tbody><tr><td>1</td><td>362.30</td><td>569.05</td><td>6.00</td><td>0.00</td><td>937.35</td></tr><tr><td>2</td><td>90.00</td><td>55.00</td><td>4.00</td><td>20.00</td><td>169.00</td></tr><tr><td>3</td><td>34.00</td><td>51.00</td><td>0.00</td><td>0.00</td><td>85.00</td></tr></tbody><tfoot><tr><td>CUMUL</td><td>486.30</td><td>675.05</td><td>10.00</td><td>20.00</td><td>1191.35</td></tr></tfoot></table>
toujours la même table, mais avec les données formatées
Si vous me contactez pas, pas de code....
A+
aladin07
Messages postés
277
Date d'inscription
vendredi 13 avril 2012
Statut
Membre
Dernière intervention
30 septembre 2012
30
Modifié par aladin07 le 3/07/2012 à 14:04
Modifié par aladin07 le 3/07/2012 à 14:04
Alors pour l'explication de if(isset($list[$j]) AND preg_match('~(?:['.$v.'])[\s+]([a-z]+)[\s+]([0-9]+)[\s+]$~i', $list[$j], $matches))
si list[j] existe et :
// (?: ) trouve sans compter
(?:['.$v.']) trouve $v (qui peut etre 1, 2 ou 3 sans le compter dans les résultats,
[\s+] suivi d'un espace ou plus
// ( ... ) à compter dans les résutltats
([a-z]+) puis un caractère ou plus à compter dans les resultats
[\s+] suivi d'un espace ou plus
([0-9]+) enusite un chiifre (le 362) à compter
// $ veut dire à la fin
[\s+]$ il y a une erreur ça devrait être [\s*]$ qui veut dire, puis rien ou un espace ou plus à la fin
Donc pour résumer:
Trouve $v sans le compter suivit d'un espace ou plus suivit d'une chaine de caractère à compter suivit d'un espace ou plus suivit d'un chiffre à compter puis des espaces ou rien à la fin
Donc les résultats seront:
$matches[0] toute la phrase
$matches[1] premier résultat compté (ex: AeRE)
$matches[2] deuxième résultat compté (ex: 362).
Le scripte fait $equipe x nbr_produits tour (12 ici) pour remplire tout le tableau, mais on a seulement 9 dans notre liste actuelle, on verra comment on va faire pour ça.
La première partie est expliqué dans les commentaires dans le code.
Puis si $list[$j] existe ($list[11] n'existe pas) et qu'on trouve le produit qui concerne l'équipe $v (par exemple au debut c'est AeRE avec 362, puis dans le dexième tour, AeTM avec 59 mais 2 AeRE 90 ne sera pas compté parce qu'il y a 2 $v est 1), s'il la trouve alors:
$complete[$v][$produit] (produit trouvé, qui est AeRE) = $nombre (362)
voilà on a changé la premiìere valeur on incrémente i et j et on continue.
Si le preg_match ne trouve pas ce qu'il veut, par exemple 3 CMT 0 il décremente le $j pour qu'il reste stable, donc le i sera à la position 10 alors que le j sera à 8, comme ça on gardera la liste à la même ligne avec la liste complète.
Maintenant pour ! (($i+1) % $nbr_produits) AND $v++;
Si ($i+1) modulo $nbr_roduit est ègale à 0 incrémenter $v.
$i+1 parce que $i commence de 0 à 11, on veut de 1 à 12 pour avoir notre modulo. Donc si le reste de la division de i+1 sur nbr_produit = 0 incrémenter $v, comme ça on aura v=1 puis 2 et 3.
Avec ce scripte tu peux ajouter d'autres produits et augmenter le nombre d'équipes facilement sans qu'il n'y ait d'erreurs.
Si le scripte t'aide et tu trouve qu'il est compréhensible (je crois maintenant que ça l'est) utilise le, je crois que c'est la meilleur solution. Sinon tu as apprit un peut de PHP :)
Et merci tu m'as donné une idée, je vais créer des tutorieaux du RegEx (preg_match() preg_replace() ...etc) dans mon blog parce que c'est TRÈS utile pour l'extraction, pour le filtrage et beaucoup d'autres choses.
si list[j] existe et :
// (?: ) trouve sans compter
(?:['.$v.']) trouve $v (qui peut etre 1, 2 ou 3 sans le compter dans les résultats,
[\s+] suivi d'un espace ou plus
// ( ... ) à compter dans les résutltats
([a-z]+) puis un caractère ou plus à compter dans les resultats
[\s+] suivi d'un espace ou plus
([0-9]+) enusite un chiifre (le 362) à compter
// $ veut dire à la fin
[\s+]$ il y a une erreur ça devrait être [\s*]$ qui veut dire, puis rien ou un espace ou plus à la fin
Donc pour résumer:
Trouve $v sans le compter suivit d'un espace ou plus suivit d'une chaine de caractère à compter suivit d'un espace ou plus suivit d'un chiffre à compter puis des espaces ou rien à la fin
Donc les résultats seront:
$matches[0] toute la phrase
$matches[1] premier résultat compté (ex: AeRE)
$matches[2] deuxième résultat compté (ex: 362).
Le scripte fait $equipe x nbr_produits tour (12 ici) pour remplire tout le tableau, mais on a seulement 9 dans notre liste actuelle, on verra comment on va faire pour ça.
La première partie est expliqué dans les commentaires dans le code.
Puis si $list[$j] existe ($list[11] n'existe pas) et qu'on trouve le produit qui concerne l'équipe $v (par exemple au debut c'est AeRE avec 362, puis dans le dexième tour, AeTM avec 59 mais 2 AeRE 90 ne sera pas compté parce qu'il y a 2 $v est 1), s'il la trouve alors:
$complete[$v][$produit] (produit trouvé, qui est AeRE) = $nombre (362)
voilà on a changé la premiìere valeur on incrémente i et j et on continue.
Si le preg_match ne trouve pas ce qu'il veut, par exemple 3 CMT 0 il décremente le $j pour qu'il reste stable, donc le i sera à la position 10 alors que le j sera à 8, comme ça on gardera la liste à la même ligne avec la liste complète.
Maintenant pour ! (($i+1) % $nbr_produits) AND $v++;
Si ($i+1) modulo $nbr_roduit est ègale à 0 incrémenter $v.
$i+1 parce que $i commence de 0 à 11, on veut de 1 à 12 pour avoir notre modulo. Donc si le reste de la division de i+1 sur nbr_produit = 0 incrémenter $v, comme ça on aura v=1 puis 2 et 3.
Avec ce scripte tu peux ajouter d'autres produits et augmenter le nombre d'équipes facilement sans qu'il n'y ait d'erreurs.
Si le scripte t'aide et tu trouve qu'il est compréhensible (je crois maintenant que ça l'est) utilise le, je crois que c'est la meilleur solution. Sinon tu as apprit un peut de PHP :)
Et merci tu m'as donné une idée, je vais créer des tutorieaux du RegEx (preg_match() preg_replace() ...etc) dans mon blog parce que c'est TRÈS utile pour l'extraction, pour le filtrage et beaucoup d'autres choses.
zolani2
Messages postés
1
Date d'inscription
mardi 3 juillet 2012
Statut
Membre
Dernière intervention
3 juillet 2012
3 juil. 2012 à 14:23
3 juil. 2012 à 14:23
Je plussoie ;)
Les expressions régulières c'est très utile
@mtardieu : je te conseille de lire ce tuto sur les expressions régulières
c'est très bien fait et ça te sera utile sûrement
https://openclassrooms.com/fr/courses/918836-concevez-votre-site-web-avec-php-et-mysql/916990-les-expressions-regulieres-partie-1-2
Bon courage !
Les expressions régulières c'est très utile
@mtardieu : je te conseille de lire ce tuto sur les expressions régulières
c'est très bien fait et ça te sera utile sûrement
https://openclassrooms.com/fr/courses/918836-concevez-votre-site-web-avec-php-et-mysql/916990-les-expressions-regulieres-partie-1-2
Bon courage !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
JooS
Messages postés
2468
Date d'inscription
mardi 22 janvier 2008
Statut
Membre
Dernière intervention
8 juin 2016
228
Modifié par JooS le 3/07/2012 à 11:54
Modifié par JooS le 3/07/2012 à 11:54
Salut !
Y a forcement une relation logique entre les données de ta table initial !
C'est avec PHP que tu dois importer ton fichier excel, qui se chargera pour chaque ligne, d'insérer chaque infos dans sa table, tout en créant les relations entre elles !
Si t'arrive pas a trouver de relation entre les données, alors détaille nous le contenu de ta table d'origine, et peut être qu'on pourra t'aider !
Mettez en résolu quand c'est résolu -.- ...
Y a forcement une relation logique entre les données de ta table initial !
C'est avec PHP que tu dois importer ton fichier excel, qui se chargera pour chaque ligne, d'insérer chaque infos dans sa table, tout en créant les relations entre elles !
Si t'arrive pas a trouver de relation entre les données, alors détaille nous le contenu de ta table d'origine, et peut être qu'on pourra t'aider !
Mettez en résolu quand c'est résolu -.- ...
Si on ne s'intéresse qu'à des produits et teams bien définis :
SELECT
res.ref,
team.ref,
COUNT( 1 ) nb_article
FROM (
SELECT 'AeRE' ref UNION
SELECT 'AeTM' ref UNION
SELECT 'CMT' ref UNION
SELECT 'ARD' ref
) product
INNER JOIN (
SELECT 'AB1' ref UNION
SELECT 'AB2' ref UNION
SELECT 'PNE' ref
) team ON 1
LEFT JOIN article_database
ON
product.ref = article_database.Product
AND article_database.Team = team.ref
GROUP BY res.ref, team.ref
--------------------------
Si on s'intéresse à toute combinaison de produits connus et Team connus :
SELECT
res.ref,
team.ref,
COUNT( 1 ) nb_article
FROM (
SELECT DISTINCT article_database.Product FROM article_database
) product
INNER JOIN (
SELECT DISTINCT article_database.Team FROM article_database
) team ON 1
LEFT JOIN article_database
ON
product.ref = article_database.Product
AND article_database.Team = team.ref
GROUP BY res.ref, team.ref
SELECT
res.ref,
team.ref,
COUNT( 1 ) nb_article
FROM (
SELECT 'AeRE' ref UNION
SELECT 'AeTM' ref UNION
SELECT 'CMT' ref UNION
SELECT 'ARD' ref
) product
INNER JOIN (
SELECT 'AB1' ref UNION
SELECT 'AB2' ref UNION
SELECT 'PNE' ref
) team ON 1
LEFT JOIN article_database
ON
product.ref = article_database.Product
AND article_database.Team = team.ref
GROUP BY res.ref, team.ref
--------------------------
Si on s'intéresse à toute combinaison de produits connus et Team connus :
SELECT
res.ref,
team.ref,
COUNT( 1 ) nb_article
FROM (
SELECT DISTINCT article_database.Product FROM article_database
) product
INNER JOIN (
SELECT DISTINCT article_database.Team FROM article_database
) team ON 1
LEFT JOIN article_database
ON
product.ref = article_database.Product
AND article_database.Team = team.ref
GROUP BY res.ref, team.ref
2 juil. 2012 à 14:56
Pourrait-tu m'envoyer le code par message privé ? (Si trop gros pour poster ici)