Besoin d'aide pour un algo
Résolu
0z0z
Messages postés
108
Date d'inscription
Statut
Membre
Dernière intervention
-
0z0z Messages postés 108 Date d'inscription Statut Membre Dernière intervention -
0z0z Messages postés 108 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous,
J'ai un site en PHP dans le quel j'ai un tableau dont les données proviennent d'un fichier CSV.
Dans ce tableau j'affiche une liste d'article qui doit être fabriqué. Et il est très probable qu'un même article doivent être fabriqué plusieurs fois.
$lesColonnes[26] représente la quantité du produit.
$lesColonnes[22] représente la référence du produit.
Ce que je voudrais c'est rassembler les produits qui ont la même référence et faire un +1 pour la quantité.
J'avais penser faire un truc du genre :
Ligne 2 et 13 c'est ce que j'ai rajouté mais qui ne fonctionne pas biensur. Donc si vous avez une petite idée je suis preneuse. Merci.
J'ai un site en PHP dans le quel j'ai un tableau dont les données proviennent d'un fichier CSV.
Dans ce tableau j'affiche une liste d'article qui doit être fabriqué. Et il est très probable qu'un même article doivent être fabriqué plusieurs fois.
$lesColonnes[26] représente la quantité du produit.
$lesColonnes[22] représente la référence du produit.
Ce que je voudrais c'est rassembler les produits qui ont la même référence et faire un +1 pour la quantité.
J'avais penser faire un truc du genre :
echo "<table border='1'>\n"; $nb = 0; while(!feof($fp)) { $nb++; echo "<tr>"; $j = sizeof($ligne); // On récupère une ligne $Ligne = fgets($fp,1024); $lesColonnes = explode(";", $Ligne); $lesColonnes = str_replace('"','',$lesColonnes); $date = date("d/m/Y"); if ($lesColonnes[17] >= $date){ if ($lesColonnes[22].[$nb] = $lesColonnes[22].[$nb-1]) { // On affiche la ligne echo "<td>$lesColonnes[23]</td>"; echo "<td>$lesColonnes[22]</td>"; echo "<td>$lesColonnes[24]</td>"; echo "<td>$lesColonnes[25]</td>"; echo "<td>$lesColonnes[26]</td>"; echo "<td>$lesColonnes[17]</td>"; echo "</tr>"; } } } echo "</table>\n";
Ligne 2 et 13 c'est ce que j'ai rajouté mais qui ne fonctionne pas biensur. Donc si vous avez une petite idée je suis preneuse. Merci.
A voir également:
- Besoin d'aide pour un algo
- Algo prono - Télécharger - Sport
- ALGO ET PASCAL - Forum Pascal
- Algo du cheval - Forum Programmation
- Demande d'algo Mastermind - Forum Programmation
- Algo arbre/graph ✓ - Forum Programmation
37 réponses
J'arrive pas à envoyer ma réponse -_-
Bah voilà ! Il doit y avoir un filtre anti
m 0
e 0
g 0
a 0
u 0
p 0
l 0
o 0
a 0
d 0
Bref... Envoi le alors en pièce-jointe à Blocks@live.fr
Bah voilà ! Il doit y avoir un filtre anti
m 0
e 0
g 0
a 0
u 0
p 0
l 0
o 0
a 0
d 0
Bref... Envoi le alors en pièce-jointe à Blocks@live.fr
J'ai utilisé la fonction fgetcsv() qui provient de ton code, qui m'a l'air assez pratique :)
En travaillant mon code, je me suis aperçu de ca :
if ($colonne[17] >= $date { // à corriger je suppose
En blablatant avec des commentaires j'en ai oublié de fermer la parenthèse, bref passons
Remarques :
1)
datea est un tableau
dateb est un timestamp
J'aurais pu utiliser une variable date pour faire les deux, mais il me semble que le changement de type de variable fait perdre de la vitesse.
2)
$date_actuelle = time() - (time() % 86400);
Pourquoi ?
86400 = nombre de secondes dans une journée
$date_actuelle = timestamp du début de journée (pas d'heures, ni de minutes, ni de secondes)
3) Je me suis inspiré d'une partie de la méthode de Defouille, donc avec les tableaux associatifs que j'ai adapté.
EDIT : Pfiou... Dès qu'on arrive à deux pages de commentaires ca dégénère dans tous les sens... Pour écrire deux messages j'ai du les envoyer 5 fois >.>
EDIT² : Ou alors je suis nul.
En travaillant mon code, je me suis aperçu de ca :
if ($colonne[17] >= $date { // à corriger je suppose
En blablatant avec des commentaires j'en ai oublié de fermer la parenthèse, bref passons
$file = "...\nomFichier.csv"; $contenu = fopen ($file, "r") or die("Cannot open $file"); if (!$fp = fopen($file,"r")) { echo "Echec de l'ouverture du fichier"; exit; } else { $conteneur = Array(); $date_actuelle = time() - (time() % 86400); while(!feof($fp)) { $colonnes = fgetcsv($fp, 1024, ';'); $datea = explode("/", $colonne[17]); $dateb = mktime(0, 0, 0, $datea[1], $datea[0], $datea[2]); if ($date_actuelle >= $dateb) { $indicateur = $colonne[22] . $dateb; if (isset($conteneur[$indicateur])) { $conteneur[$indicateur][4] += $colonne[22]; } else { $conteneur[$indicateur] = Array( $colonne[23], // 0 $colonne[22], // 1 référence $colonne[24], // 2 $colonne[25], // 3 $colonne[26], // 4 quantité $colonne[17] // 5 ); } } } fclose($fp); echo "<table border='1'>\n"; foreach ($conteneur as $colonne) { echo "<tr>"; for ($i = 0; $i<6; $i++) { echo "<td>$colonne[$i]</td>"; } echo "</tr>\n"; } } echo "</table>\n"; }
Remarques :
1)
datea est un tableau
dateb est un timestamp
J'aurais pu utiliser une variable date pour faire les deux, mais il me semble que le changement de type de variable fait perdre de la vitesse.
2)
$date_actuelle = time() - (time() % 86400);
Pourquoi ?
86400 = nombre de secondes dans une journée
$date_actuelle = timestamp du début de journée (pas d'heures, ni de minutes, ni de secondes)
3) Je me suis inspiré d'une partie de la méthode de Defouille, donc avec les tableaux associatifs que j'ai adapté.
EDIT : Pfiou... Dès qu'on arrive à deux pages de commentaires ca dégénère dans tous les sens... Pour écrire deux messages j'ai du les envoyer 5 fois >.>
EDIT² : Ou alors je suis nul.
Rha mince. Bon je t'ai envoyé le fichier par mail. Si tu n'arrives toujours pas à poster envois moi la solution par mail et si tout marche bien je la posterai moi.
Ok je suis en train de corriger mon code avec le CSV. Une question, d'où viennent les indices de tableau genre 22, 26... Moi je n'ai que trois colonnes.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Oulala j'ai un peu de mal à comprendre ce que tu as fait pour les dates. Et d'ailleurs je ne suis pas la seule.
<br />
<b>Warning</b>: mktime() expects parameter 5 to be long, string given in <b>C:\www\biosense\php\admin\la-redoute\previsionnel_livraison.php</b> on line <b>20</b><br />
<table border='1'>
<tr><td></td><td></td><td></td><td></td><td>0</td><td></td></tr>
</table>
Le Warning est répété je dirai à peu près une cinquantaine voir une centaine de fois ://
Pour la parenthèse qu'il manquait dan ton code au début je t'avais fait la remarque ce matin mais tu n'as pas du la voir :)
<br />
<b>Warning</b>: mktime() expects parameter 5 to be long, string given in <b>C:\www\biosense\php\admin\la-redoute\previsionnel_livraison.php</b> on line <b>20</b><br />
<table border='1'>
<tr><td></td><td></td><td></td><td></td><td>0</td><td></td></tr>
</table>
Le Warning est répété je dirai à peu près une cinquantaine voir une centaine de fois ://
Pour la parenthèse qu'il manquait dan ton code au début je t'avais fait la remarque ce matin mais tu n'as pas du la voir :)
J'ai fait les tests au préalable pour la date, ca devrait fonctionner
Faudrait juste vérifier que :
colonne[22] = référence
colonne[26] = quantité
colonne[17] = date (sous la forme "18/02/10" ou "18/02/2010")
Faudrait juste vérifier que :
colonne[22] = référence
colonne[26] = quantité
colonne[17] = date (sous la forme "18/02/10" ou "18/02/2010")
$file = "fichier.csv"; if (!$fp = fopen($file,"r")) { echo "Echec de l'ouverture du fichier"; exit; } else { $conteneur = Array(); $date_actuelle = time() - (time() % 86400); $colonne = fgetcsv($fp, 1024, ';'); echo "<table border='1'>\n <tr> <td>$colonne[23]</td> <td>$colonne[22]</td> <td>$colonne[24]</td> <td>$colonne[25]</td> <td>$colonne[26]</td> <td>$colonne[17]</td> </tr>"; while(!feof($fp)) { $colonne = fgetcsv($fp, 1024, ';'); if ($colonne != NULL) { $datea = explode("/", $colonne[17]); $dateb = mktime(0, 0, 0, $datea[1], $datea[0], $datea[2]); if ($date_actuelle >= $dateb) { $indicateur = $colonne[22] . $dateb; if (isset($conteneur[$indicateur])) { $conteneur[$indicateur][4] += $colonne[26]; } else { $conteneur[$indicateur] = Array( $colonne[23], // 0 $colonne[22], // 1 référence $colonne[24], // 2 $colonne[25], // 3 $colonne[26], // 4 quantité $colonne[17] // 5 ); } } } } fclose($fp); foreach ($conteneur as $colonne) { echo "<tr>"; for ($i = 0; $i<6; $i++) { echo "<td>$colonne[$i]</td>"; } echo "</tr>\n"; } echo "</table>\n"; }
Tout marche nickel.
Deux nouveautés :
- La première ligne contenant les infos textuelles est affichée tout seule.
- if ($colonne != NULL) { car d'après mes essais, parfois les fonctions vont chercher des lignes à la fin du document, des lignes vides -_-'...
Exact, tout marche nickel. Merci beaucoup.
Pourrais-tu m'explique le fonctionnement précisément pour les dates stp ?!
Parce qu'avoir un code qui marche c'est bien. Mais c'est encore mieux quand on le comprend :$
Pourrais-tu m'explique le fonctionnement précisément pour les dates stp ?!
Parce qu'avoir un code qui marche c'est bien. Mais c'est encore mieux quand on le comprend :$
Autre question. Où précises tu la date ? Parce que la il affiche pour toute les dates... Si je veux les dates supérieur au 15 du mois je fais comment ?
Et quand je fais un print $date_actuelle; il m'affiche 1266451200.
Qu'est ce que cela signifie ?
Et quand je fais un print $date_actuelle; il m'affiche 1266451200.
Qu'est ce que cela signifie ?
Oui effectivement :)
le timestamp c'est le nombre de secondes depuis le 1er janvier 1970 à minuit
1)
$colonne[17], c'est la date sous cette forme : 00/00/0000.
Prenons 18/02/2010
avec explode("/", $colonne[17]);, je récupère un tableau sous cette forme :
Ok
mktime me permet de récupérer un timestamp à partir de ces données :
puisque je n'ai que mois, jour, et an, je marque donc :
J'obtiens donc le timestamp du debut de la journée concernée (puisque aucune seconde écoulée, aucune minute écoulée, aucune heure écoulée)
2)
time() = timestamp actuel
Or, le problème, c'est que dans ce timestamp, il y a les secondes écoulés depuis le début de la journée.
Je ne veux récupérer que le timestamp de début de journée pour qu'il puise être correctement comparé à celui de l'élément 1).
Donc, puisqu'il y a 86400 secondes dans une journée, j'utilise le modulo "%"
C'est une opération qui retourne le reste d'une division
par exemple : 7 % 3 = 1
10 % 3 = 1
9 % 5 = 4
donc, je veux savoir combien de secondes se sont écoulés depuis le debut de la journée, pour les soustraire au time(), pour obtenir le timestamp de début de journée
time() % 86400
et donc,
timestamp debut journée = time() - (time() % 86400).
:D, j'espère avoir été clair.
le timestamp c'est le nombre de secondes depuis le 1er janvier 1970 à minuit
1)
$datea = explode("/", $colonne[17]); $dateb = mktime(0, 0, 0, $datea[1], $datea[0], $datea[2]);
$colonne[17], c'est la date sous cette forme : 00/00/0000.
Prenons 18/02/2010
avec explode("/", $colonne[17]);, je récupère un tableau sous cette forme :
$datea[0] = 18; $datea[1] = 02; $datea[2] = 2010;
Ok
mktime me permet de récupérer un timestamp à partir de ces données :
timestamp = mktime(heure, minutes, secondes, mois, jour, an)
puisque je n'ai que mois, jour, et an, je marque donc :
timestamp = mktime(0, 0, 0, mois, jour, an)
J'obtiens donc le timestamp du debut de la journée concernée (puisque aucune seconde écoulée, aucune minute écoulée, aucune heure écoulée)
2)
$date_actuelle = time() - (time() % 86400);
time() = timestamp actuel
Or, le problème, c'est que dans ce timestamp, il y a les secondes écoulés depuis le début de la journée.
Je ne veux récupérer que le timestamp de début de journée pour qu'il puise être correctement comparé à celui de l'élément 1).
Donc, puisqu'il y a 86400 secondes dans une journée, j'utilise le modulo "%"
C'est une opération qui retourne le reste d'une division
par exemple : 7 % 3 = 1
10 % 3 = 1
9 % 5 = 4
donc, je veux savoir combien de secondes se sont écoulés depuis le debut de la journée, pour les soustraire au time(), pour obtenir le timestamp de début de journée
time() % 86400
et donc,
timestamp debut journée = time() - (time() % 86400).
:D, j'espère avoir été clair.
si tu veux les dates supérieurs au 15 du mois, ou même en gros changer la date comme tu veux, remplace :
par
(je me permet le changement de type de variable, ces actions ne s'exécutent qu'une fois dans le code)
date_actuelle passe de chaine, à tableau, à nombre...
$date_actuelle = time() - (time() % 86400);
par
$date_actuelle = "18/02/2010"; $date_actuelle = explode("/", $date_actuelle); $date_actuelle = mktime(0, 0, 0, $date_actuelle[1], $date_actuelle[0], $date_actuelle[2]);
(je me permet le changement de type de variable, ces actions ne s'exécutent qu'une fois dans le code)
date_actuelle passe de chaine, à tableau, à nombre...
Je suis pas le meilleur du monde niveau explication. J'ai appris l'utilisation des fonctions de date sur ce tutoriel :
https://openclassrooms.com/fr/courses
Je te le conseille, il es pas long, et super bien expliqué
https://openclassrooms.com/fr/courses
Je te le conseille, il es pas long, et super bien expliqué