IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Jumeler deux tableaux


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut Jumeler deux tableaux
    Bonjour,
    A partir de deux tableaux possédant chacun une colonne comportant des valeurs de même type par exemple des dates au format "aaaa-mm-jj hh:mm:ss", je souhaite transformer l'un des deux tableaux $tab_cible de telle sorte que celui-ci possède uniquement les mêmes valeurs que $tab_source (avec éventuellement création/ajout des lignes de $tab_cible qui existent uniquement dans $tab_source).
    Pour cela j'ai crée une fonction qui permet de modifier directement tab_cible en passant par la variable par référence.
    Lorsque j'ai fini de coder la fonction, je m'aperçois d'un phénomène bizzard, la comparaison des valeur entre tab_cible et tab_source ne fonctionne pas puisque par exemple pour une date ! 2015-07-01 00:00:00 qui se trouve dans chacun des deux tableaux, php m'indique que cette valeur n'est pas identique dans les deux tableaux... et ne trouve aucune correspondance...
    Bref voici le programme utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	function jumeler_colonnes_tab($tab_source,&$tab_cible,$nom_colonne_source,$nom_colonne_cible){
     
    		foreach($tab_cible as $li1){
    			foreach($tab_source as $li2){
    				if(strrpos(utf8_encode($li2[$nom_colonne_source]),utf8_encode($li1[$nom_colonne_cible]))!==false){
    					echo "trouve<br>".$li1[$nom_colonne_cible];
    				}else {
    					echo $li1[$nom_colonne_cible]." ".$li2[$nom_colonne_source]."<br>";
    				}
    			}
    		}
               }
    et la transformation fichier csv en tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	function fichier_csv_vers_tab($nom_fichier,$option_tab){
    		$csv_tab=array();
    		$handle = @fopen($nom_fichier, "r");
    		if ($handle) {
    		    while (($buffer = fgets($handle, 4096)) !== false) {
    		        	array_push($csv_tab,str_getcsv (trim($buffer," \t\n\r\0\x0B")));					
    		    }
    		    if (!feof($handle)) {
    		        echo "Erreur: fgets() a échoué\n";
    		    }
    		    fclose($handle);
    		}	
    		return $csv_tab;
    	}
    Lorsque j'utilise cette fonction $tab_source provient d'un fichier csv converti en un tableau et tab_cible est un tableau construit directement par le programme php.
    Ce code ne parvient pas à identifier les jumeaux des colonnes sources et cibles des 2 tableaux.
    D'où peut venir le problème ? J'ai pensé à l'encodage de caractères mais visiblement non (utf8_encode() ) la présence de caractères spéciaux ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    avec des extraits significatifs du tableau $tab_source et du fichier csv, on pourrait tester...

    Au minimum, un var_dump de $tab_source et $tab_cible.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    En fait j'ai trouvé une en partie l'erreur.
    en effet mon fichier csv provient d'un fichier excel qui contient bien les dates au format MYSQL mais qui ne copie pas la valeur exacte lors d'un copier coller du coup je me suis retrouvé alors que j'étais persuadé de ne pas faire d'erreur, avec un tableau contenant des dates qui sont simplement au format aaaa-mm-jj hh:mm et sans les secondes => ce qui explique que j'ai mis s longtemps à m'apercevoir de ce dysfonctionnement.

    En revanche il me reste quelque chose de gênant : toujours après copier coller depuis excel, les données CSV lues par le programme contiennent des caractères bizzard voir ci dessous :

    Voici le résultat
    2015-07-01 00:00:00 2015-07-01 20:30:00
    2015-07-01 00:00:00 2015-07-01 21:00:00
    2015-07-01 00:00:00 2015-07-01 21:30:00
    2015-07-01 00:30:00 2015-07-01 00:00:00
    trouve
    2015-07-01 00:30:002015-07-01 00:30:00 2015-07-01 01:00:00
    2015-07-01 00:30:00 2015-07-01 01:30:00
    2015-07-01 00:30:00 2015-07-01 02:00:00
    Et pourtant je viens de vérifier : les fichiers sont tous encodés en UTF8 (le script php, le fichier csv) Je suspecte la fonction "str_getcsv " qui doit faire un peu comme elle veut ou éventuellement un caractère caché de excel... à confirmer.

    Bref en tous les cas attention lors de copier coller depuis un logiciel type excel il peut y avoir ajout ou omission de caractères, mieux vaut utiliser les fichiers textes bruts en général.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Vérifie que l'encodage est "UTF-8 sans BOM".

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    Merci pour ta réponse.
    Alors j'ai vérifié l'encodage :
    • de la sortie texte du programme (envoi vers un fichier) celui-ci est bien en utf8
    • le fichier csv est bien en utf8
    • le script php est aussi en utf8 sans bom


    J'ai testé un explode en remplacement de str_getcsv() mais rien ne change.

    Je pense peut être que cela vient de fgets() qui gère pas très bien les sauts de lignes microsoft... à tester.

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    En conclusion, après remplacement de la fonction fgets() par une fonction permettant de lire les lignes sous "windows, linux, macintosh" (windows pour mon cas) j'ai résolu le problème il n'a plus d'apparition de caractères.
    Voici les quelques lignes qui m'ont permis de supprimer l'erreur de lecture de fichier en complément du reste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function ligne_texte_vers_tab($texte){
    		$texte=str_replace("\r","\n",$texte);
    		$texte=str_replace("\n\n","\n",$texte);
    		$tab=explode("\n",$texte);
    		return $tab;
    2015-07-01 00:00:002015-07-01 00:30:002015-07-01 01:00:002015-07-01 01:30:002015-07-01 02:00:002015-07-01 02:30:002015-07-01 03:00:002015-07-01 03:30:002015-07-01 04:00:002015-07-01 04:30:002015-07-01 05:00:002015-07-01 05:30:00
    Finalement le sujet concerne plus la lecture de fichier, que la lecture de tableaux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. PL/SQL COMPARAISON DE DEUX TABLEAUX APRES BULK
    Par mimi_été dans le forum PL/SQL
    Réponses: 5
    Dernier message: 30/06/2009, 12h14
  2. Concaténation de deux tableaux
    Par mego dans le forum Langage
    Réponses: 6
    Dernier message: 19/11/2008, 11h52
  3. Réponses: 54
    Dernier message: 16/03/2006, 11h42
  4. comparer deux tableaux
    Par djibril dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2005, 15h26
  5. Réponses: 4
    Dernier message: 11/10/2005, 10h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo