Comparateur de deux tableaux php

Eléphant du PHP | 161 Messages

11 déc. 2015, 14:53

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

Mammouth du PHP | 1967 Messages

11 déc. 2015, 15:23

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
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 161 Messages

11 déc. 2015, 15:46

Pas tout à fait compris... :/

Eléphant du PHP | 161 Messages

11 déc. 2015, 15:53

J'ai initié mes variables à zéro, j'ai toujours le même résultat :/

Mammouth du PHP | 1967 Messages

11 déc. 2015, 15:59

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
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 161 Messages

11 déc. 2015, 16:06

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>"; } } }

Mammouth du PHP | 1967 Messages

11 déc. 2015, 16:09

met cette initialisation juste entre tes deux for, il faut que ces variables soit "vierge" à chaque itération de ta première boucle.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 161 Messages

11 déc. 2015, 16:13

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>

Mammouth du PHP | 2278 Messages

11 déc. 2015, 16:14

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
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 161 Messages

11 déc. 2015, 16:19

Je devrais pouvoir me débrouiller avec ça, je vais y jeter un coup d'oeil ! Merci !

Eléphant du PHP | 161 Messages

11 déc. 2015, 16:36

Déjà array_intersect ne fonctionne pas avec les fichiers apparemment :/

Eléphant du PHP | 161 Messages

11 déc. 2015, 16:53

S'il vous plaît pouvez-vous m'aider :(

Eléphant du PHP | 161 Messages

11 déc. 2015, 17:22

:(

Eléphant du PHP | 161 Messages

11 déc. 2015, 17:47

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>"; }

Mammouth du PHP | 1967 Messages

11 déc. 2015, 17:54

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
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube