Page 1 sur 2

Comparateur de deux tableaux php

Posté : 11 déc. 2015, 14:53
par lucieemtl
Bonjour à tous et toutes !

J'ai un projet de PPE (Projet Pédagogique Encadré) à faire en groupe depuis 3 semaines, et il s'avère que mes collègues n'ont pas tous remplis leur mission, donc puisque le projet est à rendre pour la semaine prochaine et pour éviter d'avoir une mauvaise note, je voudrais me pencher dessus :

Le projet concerne la génération d'un seul fichier .csv après comparaison de deux autre fichiers (de même extension !). Plus précisément, cette comparaison a pour but de produire une gestion administrative scolaire : c'est à dire qu'un élève inscrit dans fichier1.csv, se nommant Jean Lagaffe, étant en terminale STMG, n'apparaîtra pas dans le fichier fichier2.csv (à la condition que celui-ci est eu son bac bien sûr !), et le comparaison doit justement vérifier que l'élève en question apparaisse ou non dans les deux tableaux. Autre exemple : Si admettons, l'élève Jean Lagaffe est en terminale STMG dans le fichier1.csv et apparaît de cette même façon dans le fichier fichier2.csv, alors cela signifie que celui-ci a redoublé.

Passons à mon problème : Après avoir rendu possible le téléchargement de fichiers .csv, via des boutons "Parcourir" (les fichiers étant à la racine du dossier), et la mise en place des données de ces fichiers dans deux tableaux différents ($tableau1 pour fichier1.csv et $tableau2 pour fichier2.csv), il ne me reste maintenant plus qu'à les comparer. Le problème est que lorsque je supprime une ligne dans un des fichiers .csv, cela n'a aucun impact, et la comparaison ne fonctionne pas bien.
Ainsi, notre fameux Jean Lagaffe, en Terminale STMG, dans le fichier1.csv, même s'il n'apparaît pas dans le fichier2.csv, le résultat qui en sort est toujours le même : L'élève Jean Lagaffe est étudiant dans l'établissement. L'élève Jean Lagaffe a redoublé.

Comme vous le voyez, ce n'est pas logique #-o
Voici, ci-après mon code :

Code : Tout sélectionner

<!DOCTYPE> <HTML> <HEAD> <meta charset="utf-8"/> </HEAD> <BODY> <form method="POST" action="index.php" enctype="multipart/form-data"> <!-- On limite le fichier à 100Ko --> <input type="hidden" name="MAX_FILE_SIZE" value="100000"> Fichier 1 : <input type="file" name="avatar"> Fichier 2 : <input type="file" name="avatar2"> <input type="submit" name="envoyer" value="Envoyer le fichier"> </form> <?php if(isset($_POST['envoyer'])){ if (is_uploaded_file($_FILES['avatar']['tmp_name'])) { $filename = $_FILES['avatar']['tmp_name'] . "'."; } else { echo "Nom du fichier : '". $_FILES['avatar']['tmp_name'] . "'."; } //Tableau 1 $tableau1 = array(); if(($handle = fopen($_FILES['avatar']['tmp_name'], "r")) !== FALSE){ $key = 0; while(($data = fgetcsv($handle, 1000, ",")) !== FALSE){ $count = count($data); for ($i0=0; $i0 < $count; $i0++){ $tableau1[$key][$i0] = $data[$i0]; } $key++; } fclose($handle); } echo "<br/>"; print_r($tableau1); echo "<br/>"; //Tableau 2 $tableau2 = array(); $filename2 = "Pronoteentier.csv"; if(($handle2 = fopen($_FILES['avatar2']['tmp_name'], "r")) !== FALSE){ $key2 = 0; while(($data = fgetcsv($handle2, 1000, ",")) !== FALSE){ $count2 = count($data2); for ($i1=0; $i1 < $count2; $i1++){ $tableau2[$key2][$i1] = $data[$i1]; } $key2++; } fclose($handle2); } echo "<br/>"; print_r($tableau2); echo "<br/>"; //Parcours des deux tableaux for ($i=0; $i < count($tableau1); $i++) { for ($i2=0; $i2 < count($tableau2); $i2++) { //vérification de l'élève présent if( $tableau1[$i][0] === $tableau2[$i2][0] && $tableau1[$i][1] === $tableau2[$i2][1]){ //si élèves présent initialisation de vérificateur a 1 $test = 1; //vérification redoublement if ($tableau1[$i][2] === $tableau2[$i2][2]) { $test2 = 1; } } } //vérification du vérificateur pour l'èleve if($test= 1){ echo "L'èleve ".$tableau1[$i][0]." ".$tableau1[$i][1]." est un étudiant dans l'établissement.</br>"; //vérification redoublement if($test2 = 1){ echo "L'èleve ".$tableau1[$i][0]." ".$tableau1[$i][1]." a redoublé </br>"; } } else{ echo "L'èleve ".$tableau1[$i][0]." ".$tableau1[$i][1]." n'est plus présent </br>"; } } } ?> </BODY> </HTML>
J'espère que vous pourrez m'aider, je suis très soucieuse de réussite et aimerais finir le projet le plus rapidement possible.
Dans l'attente d'une réponse, je vous remercie d'avance !

Lucie MUTEREL

Re: Comparateur de deux tableaux php

Posté : 11 déc. 2015, 15:23
par Spols
Je pense que tu dois réinitialiser tes variables test et test2 à chaque boucle

Dans tout ton code, tu n'a jamais qu'une assignation à 1 des tes variables de test, il te faut donc les initier (leur donner une valeur par défaut) à 0 par exemple.
à toi de trouver où mettre cette initialisation

Re: Comparateur de deux tableaux php

Posté : 11 déc. 2015, 15:46
par lucieemtl
Pas tout à fait compris... :/

Re: Comparateur de deux tableaux php

Posté : 11 déc. 2015, 15:53
par lucieemtl
J'ai initié mes variables à zéro, j'ai toujours le même résultat :/

Re: Comparateur de deux tableaux php

Posté : 11 déc. 2015, 15:59
par Spols
Je parle de tes deux variable $test et $test2

Met toi à leur place,
au début du script, tu n'existe pas
la boucle commence, la seconde ensuite et paf on t'attribue une valeur de 1. cela arrive facilement car beaucoup d’élèves sont dans la même école d'une année à l'autre
la 2ème boucle se finit et tu as toujours la valeur que l'on t'a donné.
Ensuite un IF te demande ta valeur, tu t'empresse de la lui donné (1) et la condition suit son cours d'après cette valeur tu affiche que l'élève de la première ligne de ton 1er fichier est toujours dans l'école.
Tu passe donc à la 2ème ligne de ton 1er tableau.
Je te rappel que toi (la variable $test) tu as toujours la valeur 1.
On parcours donc le deuxième tableau à la recherche du 2ème élève du 1er tableaux.
si on le trouve on t'assigne la valeur 1 (que tu avais déjà) sinon on ne t'assigne rien
lors du questionnement IF suivant, tu as toujours la valeurs 1 tu réponds donc que l'élève est dans l'établissement même si il n'a pas été trouvé dans le 2ème fichier.

C'est donc en début de première boucle qu'il faut définir tes variables à 0 afin de les réinitialisé à chaque itération

Si après lecture de ce post tu n'y arrive toujours pas, montre nous où tu as initialiser tes variables à 0

Re: Comparateur de deux tableaux php

Posté : 11 déc. 2015, 16:06
par lucieemtl

Code : Tout sélectionner

//Parcours des deux tableaux $test = 0; $test2 = 0; for ($i=0; $i < count($tableau1); $i++) { for ($i2=0; $i2 < count($tableau2); $i2++) { //vérification de l'élève présent if( $tableau1[$i][0] === $tableau2[$i2][0] && $tableau1[$i][1] === $tableau2[$i2][1]){ //si élèves présent initialisation de vérificateur a 1 $test = 1; //vérification redoublement if ($tableau1[$i][2] === $tableau2[$i2][2]) { $test2 = 1; } } } //vérification du vérificateur pour l'èleve if($test= 1){ echo "L'èleve ".$tableau1[$i][0]." ".$tableau1[$i][1]." est un étudiant dans l'établissement.</br>"; //vérification redoublement if($test2 = 1){ echo "L'èleve ".$tableau1[$i][0]." ".$tableau1[$i][1]." a redoublé </br>"; } } else{ echo "L'èleve ".$tableau1[$i][0]." ".$tableau1[$i][1]." n'est plus présent </br>"; } } }

Re: Comparateur de deux tableaux php

Posté : 11 déc. 2015, 16:09
par Spols
met cette initialisation juste entre tes deux for, il faut que ces variables soit "vierge" à chaque itération de ta première boucle.

Re: Comparateur de deux tableaux php

Posté : 11 déc. 2015, 16:13
par lucieemtl
Donc voici mon code mais ça ne change rien :

Code : Tout sélectionner

<!DOCTYPE> <HTML> <HEAD> <meta charset="utf-8"/> </HEAD> <BODY> <form method="POST" action="index.php" enctype="multipart/form-data"> <!-- On limite le fichier à 100Ko --> <input type="hidden" name="MAX_FILE_SIZE" value="100000"> Fichier 1 : <input type="file" name="avatar"> Fichier 2 : <input type="file" name="avatar2"> <input type="submit" name="envoyer" value="Envoyer le fichier"> </form> <?php if(isset($_POST['envoyer'])){ if (is_uploaded_file($_FILES['avatar']['tmp_name'])) { $filename = $_FILES['avatar']['tmp_name'] . "'."; } else { echo "Nom du fichier : '". $_FILES['avatar']['tmp_name'] . "'."; } //Tableau 1 $tableau1 = array(); if(($handle = fopen($_FILES['avatar']['tmp_name'], "r")) !== FALSE){ $key = 0; while(($data = fgetcsv($handle, 1000, ",")) !== FALSE){ $count = count($data); for ($i0=0; $i0 < $count; $i0++){ $tableau1[$key][$i0] = $data[$i0]; } $key++; } fclose($handle); } echo "<br/>"; print_r($tableau1); echo "<br/>"; //Tableau 2 $tableau2 = array(); $filename2 = "Pronoteentier.csv"; if(($handle2 = fopen($_FILES['avatar2']['tmp_name'], "r")) !== FALSE){ $key2 = 0; while(($data = fgetcsv($handle2, 1000, ",")) !== FALSE){ $count2 = count($data2); for ($i1=0; $i1 < $count2; $i1++){ $tableau2[$key2][$i1] = $data[$i1]; } $key2++; } fclose($handle2); } echo "<br/>"; print_r($tableau2); echo "<br/>"; //Parcours des deux tableaux for ($i=0; $i < count($tableau1); $i++) { $test = 0; $test2 = 0; for ($i2=0; $i2 < count($tableau2); $i2++) { //vérification de l'élève présent if( $tableau1[$i][0] === $tableau2[$i2][0] && $tableau1[$i][1] === $tableau2[$i2][1]){ //si élèves présent initialisation de vérificateur a 1 $test = 1; //vérification redoublement if ($tableau1[$i][2] === $tableau2[$i2][2]) { $test2 = 1; } } } //vérification du vérificateur pour l'èleve if($test= 1){ echo "L'èleve ".$tableau1[$i][0]." ".$tableau1[$i][1]." est un étudiant dans l'établissement.</br>"; //vérification redoublement if($test2 = 1){ echo "L'èleve ".$tableau1[$i][0]." ".$tableau1[$i][1]." a redoublé </br>"; } } else{ echo "L'èleve ".$tableau1[$i][0]." ".$tableau1[$i][1]." n'est plus présent </br>"; } } } ?> </BODY> </HTML>

Re: Comparateur de deux tableaux php

Posté : 11 déc. 2015, 16:14
par sirakawa
Bjr,
Il existe de nombreuses fonctions de comparaison de tableaux:
En particulier
http://php.net/manual/fr/language.operators.array.php
(Si admettons, l'élève Jean Lagaffe est en terminale STMG dans le fichier1.csv et apparaît de cette même façon dans le fichier fichier2.csv, alors cela signifie que celui-ci a redoublé.)
http://php.net/manual/fr/function.array-intersect.php donne tous les redoublants dans un NOUVEAU tableau.

Code : Tout sélectionner

$redoublants = array_intersect ($t1, $t2);
et
http://php.net/manual/fr/function.array-diff.php (tab1, tab2) rend ceux qui sont dans tab1 et pas dans tab2

Re: Comparateur de deux tableaux php

Posté : 11 déc. 2015, 16:19
par lucieemtl
Je devrais pouvoir me débrouiller avec ça, je vais y jeter un coup d'oeil ! Merci !

Re: Comparateur de deux tableaux php

Posté : 11 déc. 2015, 16:36
par lucieemtl
Déjà array_intersect ne fonctionne pas avec les fichiers apparemment :/

Re: Comparateur de deux tableaux php

Posté : 11 déc. 2015, 16:53
par lucieemtl
S'il vous plaît pouvez-vous m'aider :(

Re: Comparateur de deux tableaux php

Posté : 11 déc. 2015, 17:22
par lucieemtl
:(

Re: Comparateur de deux tableaux php

Posté : 11 déc. 2015, 17:47
par lucieemtl
S'il vous plaît.... Le problème est juste qu'il ne passe pas par mon else...

[...]

Code : Tout sélectionner

if($test = 1){ echo "L'èleve ".$tableau1[$i][0]." ".$tableau1[$i][1]." est un étudiant dans l'établissement.</br>"; //vérification redoublement if($test2 = 1){ echo "L'èleve ".$tableau1[$i][0]." ".$tableau1[$i][1]." a redoublé </br>"; } } else{ echo "L'èleve ".$tableau1[$i][0]." ".$tableau1[$i][1]." n'est plus présent </br>"; }

Re: Comparateur de deux tableaux php

Posté : 11 déc. 2015, 17:54
par Spols
affiche la valeur de tes variables a différent endroit du code pour trouver où elles ne prennent pas la valeur que tu voudrais

Le double, triple, ... post est très mal vu, ce n'est pas en polluant ton propre sujet que les gens vont y répondre plus vite

Je viens de voir, dans un if l'égalité c'est un double == et pas un simple