Algo en PHP

Résolu/Fermé
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 - 19 févr. 2010 à 16:45
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 - 24 févr. 2010 à 09:14
Bonjour,

J'ai un site fait en PHP. Dans ce site j'affiche dans un tableau des infos que je récupère dans un fichier CSV.
Enfaite, ce fichier contient une liste de produits qui doivent être fabriqué avant une certaine date.
Pour le moment il y a la liste des produits avec la date à laquelle ils doivent être fabriqué dans un même tableau.
Ce que je voudrais c'est faire un tableau différent pour chaque date.

Pourriez-vous m'aider s'il vous plait parce que pour l'instant je n'arrive à faire des tableaux différents seulement en mettant des dates à la main.
Il faudrait juste une boucle avec la date mais alors ou la placer et comment mettre cette boucle....

Voici mon code :
$file = $_FILES['fichier_csv']['tmp_name'];
$contenu = fopen ($file, "r") or die("Can not open $file");
if (!$fp = fopen($file,"r")) {
	echo "Echec de l'ouverture du fichier";
}
else {
	$date_actuelle = date('d/m/Y');
	$date_actuelle = explode("/", $date_actuelle);
	$date_actuelle = mktime(0, 0, 0, $date_actuelle[1], $date_actuelle[0], $date_actuelle[2]);
	$conteneur = Array();
	$colonne = fgetcsv($fp, 1024, ';');
	echo "<table border='1'>";
		echo "<td>$colonne[23]</td>";
		echo "<td>$colonne[22]</td>";
		echo "<td>$colonne[24]</td>";
		echo "<td>$colonne[25]</td>";
		echo "<td>$colonne[26]</td>";
		echo "<td>$colonne[17]</td>";
	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],$colonne[22],$colonne[24],$colonne[25],$colonne[26],$colonne[17]
					);
				}
			}
			
		}
	}
	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";
}
A voir également:

29 réponses

Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
23 févr. 2010 à 11:55
Date dans l'array des dates: 11/02/2010 Date dans le conteneur: 11/02/10

voilà le pb, on compare la chaine 11/02/2010 à 11/02/10 c'est pas pareil

donc modifies la ligne

if(date('d/m/Y',$value) == ...

Y c'est l 'année sur 4 chiffres, y c'est sur 2 chiffres

par

if(date('d/m/y',$value) ==

//lignes des donnees correspondant à cette date					
				foreach($conteneur as $cle2=>$value2){
				
					////TEST
					echo 'Date dans l\'array des dates: '.date('d/m/Y',$value).' Date dans le conteneur: '.trim($value2[5]);'<br />';
					/////
					
						if(date('d/m/y',$value) == trim($value2[5])){ //trim pour supprimer les espaces eventuels qui trainent en debut et fin
1
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
23 févr. 2010 à 11:59
Est-t-il normal qu'il y ai des 18 dans le premier et des 11 dans le second ?

oui puisque $array_liste_datesA contient seulement ces deux dates

donc le premier coup on compare la première (11/02/2010) à celle de $conteneur

et le deuxième coup on compare 18/02/2010 à celles de $conteneur
1
Defouille Messages postés 388 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 15 novembre 2011 54
19 févr. 2010 à 16:52
Tu peux créer deux tableaux différents que tu afficheras plus tard :

$tab1=array();
$tab2=array();
foreach($mon_tab_principal as $t)
{
    if(strtotime($t->ma_date) < time())
        $tab1[]=$t ;
    else
        $tab2[]=$t ;
}


Et maintenant que tu as tes deux tableaux tu en fais ce que tu veux;
0
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 5
19 févr. 2010 à 16:56
Oui mais le problèmes c'est que je peux avoir plus de 2 tableaux. Donc enfaite le nombre de tableaux doit se définir selon le nombre de date supérieur à la date système (et différentes).

Me comprends tu ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Defouille Messages postés 388 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 15 novembre 2011 54
19 févr. 2010 à 17:18
bah alors tu fais un tableau associatif :

$tab=array();
foreach($mon_tab_principal as $t)
{
    $date_courante = strtotime($t->ma_date) ;
    if($date_courante < time())
        $tab['ancienne_date']=$t ;
    else
        $tab[$date_courante][] = $t ;
}


Pour afficher :
echo "<pre>";
print_r($tab);
die("</pre>");

0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
19 févr. 2010 à 17:51
Salut, essayes comme ça:

$file = $_FILES['fichier_csv']['tmp_name'];
$contenu = fopen ($file, "r");
if (!$fp = fopen($file,"r")) {
	echo "Echec de l'ouverture du fichier";
	exit;
}
else {
	$date_actuelle = date('d/m/Y');
	$date_actuelle = explode("/", $date_actuelle);
	$date_actuelle = mktime(0, 0, 0, $date_actuelle[1], $date_actuelle[0], $date_actuelle[2]);
	$conteneur = Array();
	$colonne = fgetcsv($fp, 1024, ';');
	$array_titres=array($colonne[23],$colonne[22],$colonne[24],$colonne[25],$colonne[26],$colonne[17]);
	$array_datesA=array(); //dans cet array on va stocker toutes les dates
	
	while(!feof($fp)) {
		$colonne = fgetcsv($fp, 1024, ';'); 
		if ($colonne != NULL) { 
			//timestamp de la datea
			$datea = explode("/", $colonne[17]); 	
			$dateb = mktime(0, 0, 0, $datea[1], $datea[0], $datea[2]);
			//datea dans l'array
			$array_datesA[]=$dateb;
			//on empile tout dans l'array $conteneur
			$indicateur = $colonne[22] . $dateb;
			if (isset($conteneur[$indicateur])) {
				$conteneur[$indicateur][4] += $colonne[26];
			}else {
				$conteneur[$indicateur] = Array(	
				$colonne[23],$colonne[22],$colonne[24],$colonne[25],$colonne[26],$colonne[17]
			}
		}
	}
	fclose($fp);
	
	//on dedoublonne l'array des dates A => on va ainsi avoir la liste des dates
	$array_liste_datesA=array_unique($array_datesA);
	
	//on va parcourir cet array pour faire un tableau à chaque fois
	if(sizeof($array_liste_datesA)>0){
		foreach($array_liste_datesA as $cle=>$value){
			//TITRE DU TABLEAU
			echo '<b>A realiser pour le: '.date('d / m / Y',$value).'</b><br />';
			//tableau
			echo '<table border="1">';
			//ligne des titres
			echo '<tr>'; //n'oublies pas le tr
			for($i=0;$i<sizeof($array_titres)$i++){
				echo '<th>'.$array_titres[$i].'</th>';			
			}
			echo '</tr>';
			//lignes des donnees correspondant à cette date
			echo '<tr>'; 
			foreach($conteneur as $cle2=>$value2){
				echo '<td>'.$value2[0].'</td><td>'.$value2[1].'</td><td>'.$value2[2].'</td><td>'.$value2[3].'</td><td>'.$value2[4].'</td><td>'.$value2[5].'</td>';			
			}
			echo '</tr>';
			echo '</table>';
		}
	}
}

0
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 5
19 févr. 2010 à 21:56
Salut Alain_42. J'ai essayé ce que tu as mit et cela fonctionne.
Il y a juste un petit bug, dans le dernier foreach il ne retourne pas à la ligne. C'est-à-dire qu'il m'affiche tout sur une seule ligne.
J'ai essayé en rajoutant <tr> juste avant <td> mais...
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
20 févr. 2010 à 10:30
j'avais oublié vers la fin (manque de temps) un test important, et les tr pas dans la boucle:

//on va parcourir cet array pour faire un tableau à chaque fois
	if(sizeof($array_liste_datesA)>0){
		foreach($array_liste_datesA as $cle=>$value){
			//TITRE DU TABLEAU
			echo '<b>A realiser pour le: '.date('d / m / Y',$value).'</b><br />';
			//tableau
			echo '<table border="1">';
			//ligne des titres
			echo '<tr>'; //n'oublies pas le tr
			for($i=0;$i<sizeof($array_titres)$i++){
				echo '<th>'.$array_titres[$i].'</th>';			
			}
			echo '</tr>';
			//lignes des donnees correspondant à cette date			
				
				foreach($conteneur as $cle2=>$value2){
					echo '<tr>'; //je n'avais pas mis le TR dans la boucle, c'est normal que ça te metait tout dans la même ligne
					///// il faut tester si la ligne de donnees correspond a cette date: (j'avais oublié ce if)
						if($value == $value2[5]){ //a verifier si c'est bien dans cette colonne que se trouve la date dans l'array $conteneur
							echo '<td>'.$value2[0].'</td><td>'.$value2[1].'</td><td>'.$value2[2].'</td><td>'.$value2[3].'</td><td>'.$value2[4].'</td><td>'.$value2[5].'</td>';			
						}
					///////
					echo '</tr>';					
				}
			
			//////
			echo '</table>';
		}
	}
}
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
21 févr. 2010 à 11:23
Houps je n'avait décidement pas les yeux en face des trous, le code ci dessu sdevait te donner des lignes vides en plus

rectifies:

//lignes des donnees correspondant à cette date			
				
				foreach($conteneur as $cle2=>$value2){					
					///// il faut tester si la ligne de donnees correspond a cette date: (j'avais oublié ce if)
						if($value == $value2[5]){ //a verifier si c'est bien dans cette colonne que se trouve la date dans l'array $conteneur
							echo '<tr>'; //je n'avais pas mis le TR dans la boucle,et pas au bon endroit
								echo '<td>'.$value2[0].'</td><td>'.$value2[1].'</td><td>'.$value2[2].'</td><td>'.$value2[3].'</td><td>'.$value2[4].'</td><td>'.$value2[5].'</td>';			
							echo '</tr>';	
						}
					///////						
				}
0
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 5
21 févr. 2010 à 14:25
Et bien j'ai essayé avec les deux versions mais dans les deux cas les tableaux sont vide... :/
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
21 févr. 2010 à 15:35
est ce que tes dates sont bien en colonne[17] c a dire la 18 ième

il me faudrait un bout de ton fichier csv pour que je puisse tester, mets le en MP ou éventuellement ton mail en MP( en fichier joint ensuite ce sera plus facile)
0
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 5
21 févr. 2010 à 15:41
Oui oui elle est bien à la 18ème colonne. Je t'envoie un MP.
0
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 5
22 févr. 2010 à 13:52
//$file = 'invoices_20100210.csv';
$file = $_FILES['fichier_csv']['tmp_name'];
$contenu = fopen ($file, "r");
if (!$fp = fopen($file,"r")) {
	echo "Echec de l'ouverture du fichier";
	exit;
}
else {
	$date_actuelle = date('d/m/Y');
	$date_actuelle = explode("/", $date_actuelle);
	$date_actuelle = mktime(0, 0, 0, $date_actuelle[1], $date_actuelle[0], $date_actuelle[2]);
	$conteneur = Array();
	$colonne = fgetcsv($fp, 1024, ';');
	$array_titres=array($colonne[23],$colonne[22],$colonne[24],$colonne[25],$colonne[26],$colonne[17]);
	$array_datesA=array(); //dans cet array on va stocker toutes les dates
	
	while(!feof($fp)) {
		$colonne = fgetcsv($fp, 1024, ';'); 
		if ($colonne != NULL) { 
			//timestamp de la datea
			$datea = explode("/", $colonne[17]); 	
			$dateb = mktime(0, 0, 0, $datea[1], $datea[0], $datea[2]);
			//datea dans l'array
			$array_datesA[]=$dateb;
			//on empile tout dans l'array $conteneur			
			
			$indicateur = $colonne[22] . $dateb;
			if (isset($conteneur[$indicateur])) {
				$conteneur[$indicateur][4] += $colonne[26];
			}else {
				$conteneur[$indicateur] = Array(	
				$colonne[23],$colonne[22],$colonne[24],$colonne[25],$colonne[26],$colonne[17]); //erreur la  manque ) et ;
			}
			
		}
	}
	fclose($fp);
	
	//on dedoublonne l'array des dates A => on va ainsi avoir la liste des dates
	$array_liste_datesA=array_unique($array_datesA);
	echo '<pre>';
	print_r($conteneur);
	echo '<pre>';
	//on va parcourir cet array pour faire un tableau à chaque fois
	if(sizeof($array_liste_datesA)>0){
		foreach($array_liste_datesA as $cle=>$value){
			//TITRE DU TABLEAU
			echo '<b>A realiser pour le: '.date('d / m / Y',$value).'</b><br />';
			//tableau
			echo '<table border="1">';
			//ligne des titres
			echo '<tr>'; //n'oublies pas le tr
			for($i=0;$i<sizeof($array_titres);$i++){ //erreur la manque ;
				echo '<th>'.$array_titres[$i].'</th>';			
			}
			echo '</tr>';
			//lignes des donnees correspondant à cette date	
				/*j'ai trouvé:
				dans l'array $conteneur, les dates sont au format jj/mm/aaaa
				et dans l'array liste_datesA elles sont au format timestamp donc la comparaison ne se fait pas
				il faut donc remttre au format jj/mm/aaaa avant de comparer
				*/
				foreach($conteneur as $cle2=>$value2){					
						if(date('d/m/Y',$value) == trim($value2[5])){ //trim pour supprimer les espaces eventuels qui trainent en debut et fin
							echo '<tr>'; 
								echo '<td>'.$value2[0].'</td><td>'.$value2[1].'</td><td>'.$value2[2].'</td><td>'.$value2[3].'</td><td>'.$value2[4].'</td><td>'.$value2[5].'</td>';			
							echo '</tr>';	
						}
					///////						
				}

			echo '</table>';
		}
	}
}


Voici le code qu'Alain_42 m'a envoyé et qui fonctionne très bien sur mon pc personnel.
Par contre il retourne des tableaux vide quand je suis sur le pc au bureau.
Je ne comprend pas pourquoi.
Sur mon pc personnel je travaille avec wamp et sur celui du bureau je travaille avec PhpMyAdmin, MySql et Apache. Serait-ce à cause de ca ??
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
22 févr. 2010 à 14:07
salut c'est encore moi

As tu la même version de php au bureau que chez toi ?

ensuite j'ai remarqué que ton fichier source n'a pas les " qui entourent chaque valeur de champ csv

alors essayes en ouvrant ton fichier .csv avec openOffiche calc et en l'enregistrant sous le même nom

avant de faire le traitement
0
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 5
22 févr. 2010 à 14:29
Salut Alain_42.

J'ai php5 pour les 2.
Et j'ai reprit exactement le même fichier csv chez moi sans rien y changer. Ni même le nom.
Je ne vois pas trop de quoi tu veux parler quand tu dis : "ton fichier source n'a pas les " qui entourent chaque valeur de champ csv" .
0
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 5
22 févr. 2010 à 15:38
Sur mon portable j'ai php5.3.0 et sur celui du bureau j'ai php5.2.12 il me semble.
Problème de compatibilité peut-être ? ://
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
22 févr. 2010 à 18:39
concernant les " qui entourent les valeurs d'un fichier csv:

ex d'une ligne si tu l'ouvres par exemple avec notepad++

"champ1";"champ2";"champ3" etc...


alors que dans ton fichier tu as:


champ1;champ2;champ3 etc...


ça gene peut être php pour lire les champs csv

sinon on va mettre des echo pour voir:

<?php
$file = 'invoices_20100210.csv';
//$file = $_FILES['fichier_csv']['tmp_name'];

//$contenu = fopen ($file, "r"); //cette ligne est en trop tu ouvre deux fois le fichier

if (!$fp = fopen($file,"r")) {
	echo "Echec de l'ouverture du fichier";
	exit;
}else {
	$date_actuelle = date('d/m/Y');
	$date_actuelle = explode("/", $date_actuelle);
	$date_actuelle = mktime(0, 0, 0, $date_actuelle[1], $date_actuelle[0], $date_actuelle[2]);
	$conteneur = Array();
	$colonne = fgetcsv($fp, 1024, ';');
	$array_titres=array($colonne[23],$colonne[22],$colonne[24],$colonne[25],$colonne[26],$colonne[17]);
	$array_datesA=array(); //dans cet array on va stocker toutes les dates
	
	while(!feof($fp)) {
		$colonne = fgetcsv($fp, 1024, ';'); 
		if ($colonne != NULL) { 
			//timestamp de la datea
			$datea = explode("/", $colonne[17]); 
			//j'ai regarde de plus pres, tes dates sont au format jj/mm/aa hors pour avoir un timesatmp il faut lui passer h m s  mm jj aaaa l'annee sur 4 chiffres
			//$dateb = mktime(0, 0, 0, $datea[1], $datea[0], $datea[2]);
			$dateb = mktime(0, 0, 0, $datea[1], $datea[0], '20'.$datea[2]);
			//datea dans l'array
			$array_datesA[]=$dateb;
		
			//on empile tout dans l'array $conteneur			
			
			$indicateur = $colonne[22] . $dateb;
			if (isset($conteneur[$indicateur])) {
				$conteneur[$indicateur][4] += $colonne[26];
			}else {
				$conteneur[$indicateur] = Array(	
				$colonne[23],$colonne[22],$colonne[24],$colonne[25],$colonne[26],$colonne[17]); //erreur la  manque ) et ;
			}
			
		}
	}
	fclose($fp);
	
	////TEST
		echo 'Nombre de lignes de l\'array conteneur: '.sizeof($conteneur).'<br />';
		echo 'Nombre de colonnes de l\'array conteneur: '.sizeof($array_titres).'<br />';
	
	////
	
	//on dedoublonne l'array des dates A => on va ainsi avoir la liste des dates
	$array_liste_datesA=array_unique($array_datesA);
	echo '<pre>';
	print_r($conteneur);
	echo '<pre>';
	//on va parcourir cet array pour faire un tableau à chaque fois
	if(sizeof($array_liste_datesA)>0){
		foreach($array_liste_datesA as $cle=>$value){
			//TITRE DU TABLEAU
			echo '<b>A realiser pour le: '.date('d / m / Y',$value).'</b><br />';
			//tableau
			echo '<table border="1">';
			//ligne des titres
			echo '<tr>'; //n'oublies pas le tr
			for($i=0;$i<sizeof($array_titres);$i++){ //erreur la manque ;
				echo '<th>'.$array_titres[$i].'</th>';			
			}
			echo '</tr>';
			
			
			//lignes des donnees correspondant à cette date					
				foreach($conteneur as $cle2=>$value2){
				
					////TEST
					echo 'Date dans l\'array des dates: '.date('d/m/Y',$value).' Date dans le conteneur: '.trim($value2[5]);'<br />';
					/////
					
						if(date('d/m/Y',$value) == trim($value2[5])){ //trim pour supprimer les espaces eventuels qui trainent en debut et fin
							echo '<tr>'; 
								echo '<td>'.$value2[0].'</td><td>'.$value2[1].'</td><td>'.$value2[2].'</td><td>'.$value2[3].'</td><td>'.$value2[4].'</td><td>'.$value2[5].'</td>';			
							echo '</tr>';	
						}
					///////						
				}

			echo '</table>';
		}
	}
}
0
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 5
23 févr. 2010 à 09:30
Je ne pense pas que le manque des " qui entourent les valeurs gène le php pour lire les valeurs sinon ca n'aurait pas fonctionner sur mon pc.
Tu as le fichier csv toi aussi. Et je suppose qu'avant de mettre le code ici tu l'as testé et qu'il fonctionne bien, c'est-à-dire que les tableaux ne sont pas vide ?!
Tout est nickel sur mon pc à moi. Il faut juste que je trouve pourquoi pourquoi ca ne fonctionne pas sur ce pc...
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
23 févr. 2010 à 10:51
Oui chez moi ça fonctionne Nickel

Mais as tu mis le bout de code que je t'ai donné ci dessus avec les echo pour voir ce qui se passe ?

et tu ouvrait deux fois le fichier par fopen
0
0z0z Messages postés 108 Date d'inscription mardi 9 février 2010 Statut Membre Dernière intervention 18 mai 2010 5
23 févr. 2010 à 10:59
Oui je l'ai mit. Il affiche une ligne au dessus des tableaux.

Pour le premier :
Date dans l'array des dates: 11/02/2010 Date dans le conteneur: 11/02/10
Date dans l'array des dates: 11/02/2010 Date dans le conteneur: 11/02/10
Date dans l'array des dates: 11/02/2010 Date dans le conteneur: 11/02/10
Date dans l'array des dates: 11/02/2010 Date dans le conteneur: 18/02/10
Date dans l'array des dates: 11/02/2010 Date dans le conteneur: 18/02/10
Date dans l'array des dates: 11/02/2010 Date dans le conteneur: 18/02/10

Pour le second :
Date dans l'array des dates: 18/02/2010 Date dans le conteneur: 11/02/10
Date dans l'array des dates: 18/02/2010 Date dans le conteneur: 11/02/10
Date dans l'array des dates: 18/02/2010 Date dans le conteneur: 11/02/10
Date dans l'array des dates: 18/02/2010 Date dans le conteneur: 18/02/10
Date dans l'array des dates: 18/02/2010 Date dans le conteneur: 18/02/10
Date dans l'array des dates: 18/02/2010 Date dans le conteneur: 18/02/10

Est-t-il normal qu'il y ai des 18 dans le premier et des 11 dans le second ?

Pour l'ouverture du fichier j'ai effacé la ligne $contenu... qui était un peu inutile.
0