Page 1 sur 1

comparer deux tableaux sur une seule valeur

Posté : 20 mars 2009, 00:26
par new morning
Bonjour,

J'essaie d'utiliser array_diff pour comparer deux tableaux contenant des noms d'utilisateurs. Ca marche assez bien, très bien même en fait.

Le problème est que je ne sais absolument pas me servir du résultat : soit j'utilise un tableau à 2 dimension contenant AUSSI le mail de l'utilisateur, auquel cas array_diff relève ceux qui ont simplement modifié leur adresse mail, soit j'utilise un tableau contenant uniquement le nom d'utilisateur et je ne sais plus retrouver le mail de l'utilisateur correspondant aux valeurs (noms d'utilisateurs) retournées par array_diff.

Comment faire ?

Ci-dessous un début de code d'illustration :
<?php




	// Je récupère mon fichier

	$name = $_FILES['csv']['name'];
	$tmp_name = $_FILES['csv']['tmp_name'];


	//Je vais faire 2 tableaux pour récupérer les données qui s'y trouvent : utilisateur et mail

	$array_username = array() ; 
	$array_mail = array() ;


	$handle = fopen($tmp_name, "r");
	$row = 0;


	while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 

	{	
		$array_username[$row] = $data[0];
		$array_mail[$row] = $data[1];
		$row++;
	}

	fclose($handle);
	unlink($tmp_name);

	
	// je vais chercher dans ma base de donnée tout ce dont j'ai besoin pour la suite

	$result = mysql_query("SELECT ref_name, email, id FROM users") or die('Impossible to connect'] . mysql_error());;
		
	$row = 0;
	while ($donnees = mysql_fetch_array($result) )

	{
		$row ++;	
		$array_forum [$row] = $donnees['ref_name'];
		$array_forum_mail [$row] = $donnees ['email'];
		$array_forum_id [$row] = $donnees ['id'];
	}

	mysql_free_result($result);


	// Ensuite je voudrais comparer ma base avec le fichier csv, en me basant sur le champs [ref_name] maintenant dans $array_forum


	$removed_members =  array_diff ($array_forum, $array_username) ; // Ca c'est le tableau contenant les utilisateurs à supprimer



	foreach($removed_members as &$value) // on va parcourir ce tableau

	{


		$username = $value;

		$email	= // Comment je m'y retrouve maintenant ???

	}

Posté : 20 mars 2009, 10:32
par Aureusms
Bonjour,

J'ai eu à peu près le même problème. J'ai d'abord stocké dans un tableau où l'email de l'utilisateur était la clé : si deux fois le même email (ce qui est normalement impossible chaque email est unique): écrasement de l'ancienne valeur. Comme un exemple vaut mieux qu'un grand discours :
(Note : tu peux faire pareil avec le nom)
<?php

    // Je récupère mon fichier

    $name = $_FILES['csv']['name'];
    $tmp_name = $_FILES['csv']['tmp_name'];


    //Je vais faire 2 tableaux pour récupérer les données qui s'y trouvent : utilisateur et mail

    $array_tmp = array();


    $handle = fopen($tmp_name, "r");
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 

    {    
        $array_tmp[$data[1]] = $data[0];

    }

    fclose($handle);
    unlink($tmp_name);

    
    // je vais chercher dans ma base de donnée tout ce dont j'ai besoin pour la suite

    $result = mysql_query("SELECT ref_name, email, id FROM users") or die('Impossible to connect'] . mysql_error());;
        
   //j'ai changé ici array par assoc pour gagner en rapidité
  while ($donnees = mysql_fetch_assoc($result) )

    {
        $row ++;    
        $array_forum [$donnees ['email']]["name"] = $donnees['ref_name'];
        $array_forum_id [$donnees ['email']]["id"] = $donnees ['id'];
    }

    mysql_free_result($result);


    // Ensuite je voudrais comparer ma base avec le fichier csv, en me basant sur le champs [ref_name] maintenant dans $array_forum


    $removed_members =  array_diff_key ($array_forum, $array_username) ; // Ca c'est le tableau contenant les utilisateurs qui ont le même email à supprimer

   $tab_insertion = array();
    foreach ($array_tmp as $cle => $valeur)
   {
   //on regarde si la clé n'est pas dans le tableau $removed_members
   if (!in_array($cle,$removed_members))
     {
     //la clé n'y ai pas alors on créé le tableau pour pouvoir l'insérer dans la base
     $tab_insertion[$cle]= $valeur ;
     }
   }


Posté : 20 mars 2009, 10:41
par new morning
Excellent Aureusms !

C'est exactement ce qu'il me manquait, je crois. Je vérifie ça dès que je rentre du taf !

Posté : 27 mars 2009, 00:02
par new morning
Ca m'a super bien aidé ce code, merci encore ! :D

Mon problème est maintenant résolu :D :D :D

Posté : 27 mars 2009, 00:43
par zeus
Modération :
new morning, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.