comparer deux tableaux sur une seule valeur

Eléphanteau du PHP | 23 Messages

20 mars 2009, 00:26

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 ???

	}

ViPHP
ViPHP | 1996 Messages

20 mars 2009, 10:32

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

It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphanteau du PHP | 23 Messages

20 mars 2009, 10:41

Excellent Aureusms !

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

Eléphanteau du PHP | 23 Messages

27 mars 2009, 00:02

Ca m'a super bien aidé ce code, merci encore ! :D

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 mars 2009, 00:43

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.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer