Page 1 sur 1

tri d'un tableau

Posté : 07 août 2006, 19:29
par nejme.eddinne
Bonsoir
J'ai un fichier CSV, de cette forme:
id | Nom | date | heure | code_presence
contenu
18 | abcd | 06/08/2006 | 8:00 | Entree
32 | lkjkk | 06/08/2006 | 8:05 | Entree
23 | ldlllld | 06/08/2006 | 9:00 | Entree
18 | abcd | 06/08/2006 | 16:00 | Sortie
23 | ldlllld | 06/08/2006 | 15:30 | Sortie
je veux le rendre de cette façon
id | nom | date | entree | sortie
contenu
18 | abcd | 06/08/2006 | 8:00 | 16:00
32 | lkjkk | 06/08/2006 | 8:05 | --
23 | ldlllld | 06/08/2006 | 9:00 | 15:30
qq1 peut m'aider ?? !!
Merci

Posté : 07 août 2006, 20:57
par Truc
Salut,

Faudrait commencer par lire le fichier avec fgetcsv() puis construire un tableau à deux dimensions (par exemple) :
$tab = array();
boucle $ligne = fgetcsv()
{
    if(!isset($tab[$ligne[0]])) // si l'élément n'existe pas on crée l'entrée
   {
      $sous_tab = array();
      $sous_tab["id"] = $ligne[0];
      $sous_tab["nom"] = $ligne[1];
      $sous_tab["date"] = $ligne[2];
      $sous_tab["entree"] = $ligne[3];
      $tab[$ligne[0]]= $sous_tab;
   }
   else // sinon on ajoute juste l'heure de sortie au meme élément
     $tab[$ligne[0]]= array("sortie"=>$ligne[3]); 
}
Pour verifier le contenu du tableau
<pre>
<?php print_r($tab); ?>
</pre>

Posté : 08 août 2006, 09:18
par nejme.eddinne
Bonjour
Merci, mais la lecture du fichier csv c pas un prblm je peux le lire mm en faisant:
<?
$fichier=fopen('fichier.csv','r');
$contenu=fread($fichier,filesize('fichier.csv'));
$lignes=explode('\n',$contenu);
$champs=explode(';',$lignes);
?>
mon prblm c que je peux avoir des doublons de la mm personne, mais une pour l'entree et l'autre pour la sortie, parfois il n'ya que l'entrée ...

Posté : 08 août 2006, 10:00
par Cyrano
:idea: Crée la ligne complète avec une valeur par défaut ("--") et en faisant le tour du fichier d'origine, mets à jour les valeurs au fur et à mesure.

Posté : 08 août 2006, 12:48
par Truc
Bonjour
Merci, mais la lecture du fichier csv c pas un prblm je peux le lire mm en faisant
(...)
mon prblm c que je peux avoir des doublons de la mm personne, mais une pour l'entree et l'autre pour la sortie, parfois il n'ya que l'entrée ...
Evite le langage sms qui n'est pas pratique pour la lecture :wink:

As tu travaillé avec le code proposé ? (j'ai pas testé ce que ça donne mais il ne doit pas être si loin de la verité :-k )

Posté : 10 août 2006, 09:17
par nejme.eddinne
Bonjour
J'ai pris votre code, il ne m'a pas rien affiché :?
mais j'ai trouvé la solution ma tt était sur le point de s'exploser :P
pour un fichier csv:
1;a;entr;10
1;a;sort;2
2;f;entr;5
2;f;---;4
2;f;sort;6
3;t;sort;9
3;t;entr;55
<?
$fichier=fopen("test.csv",'r');
$contenu=fread($fichier,filesize("test.csv"));
	$lignes=explode("\n",$contenu);
	//print_r($lignes);
	
	for($i=0;$i<sizeof($lignes);$i++)
	{
		$lignes[$i]=explode(";",$lignes[$i]);
	}
		sort($lignes,0);
			$i=1;
			$trv=0;
			$pntg=0;
			//echo sizeof($lignes);
			while($i<sizeof($lignes))
			{
			
				for($k=$i;$k<=sizeof($lignes);$k++)
				{
					if($lignes[$i][0]!=$lignes[$k][0])
					{
					$trv=$k;
					break;
					
					}
				
				}

				
				for($j=$i;$j<$trv;$j++)
				{
				
				
					if($lignes[$j][2]=="sort")
					$sortie=$lignes[$j][3];

					if($lignes[$j][2]=="entr")
					$entree=$lignes[$j][3];
				
				
				}
				
				
				if($entree!="" || $sortie!="")
				{
				$tab[$i]=array("id"=>$lignes[$i][0],"Nom"=>$lignes[$i][1],"entree"=>$entree,"sortie"=>$sortie);
				$pntg++;
				}
				

				$entree="";
				$sortie="";
								
			$i=$trv;
			}
			
			echo " <table>
			<tr> <td> Id </td> <td> Nom </td> <td> Entree </td> <td> Sortie </td> </tr>";
			foreach($tab as $value)
			{
			echo "<tr> <td>".$value["id"]." </td> <td> ".$value["Nom"]." </td> <td> ".$value["entree"]." </td> <td> ".$value["sortie"]." </td> </tr>";
			}
			echo "</table>";
		
?>
le principe était de découpé le tableau en sous tableau et travailler sur ces parties ceci me donnera:
Id Nom Entree Sortie
1 a 10 2
2 f 5 6
3 t 55 9
merci bien