Comparaison de tableaux
Résolu
Coutcout86
Messages postés
219
Statut
Membre
-
Caligros -
Caligros -
Bonjour,
J'ai un petit problème pour comparer deux tableaux PHP.
Voici mon premier tableau sorti d'une requête LDAP:
Et voici mon autre tableau sorti d'une requête MySQL :
Et ce que j'aimerais c'est faire un comparaison. Pour chaque clé ''identifiant'' du tableau LDAP, si celle-ci est égale à une clé ''identifiant'' MySQL on met à jour les informations de la personne concernée dans la base de données MySQL sinon on fais rien. Et enfin si la clé ''identifiant'' LDAP n'existe pas dans une des clés ''identifiant'' MySQL on créé un enregistrement dans la base.
Est-ce possible ? Pourriez-vous m'aider ? Faudrait-il faire un FOREACH dans un FOREACH ?
Merci d'avance.
Romain COUTINEAU.
J'ai un petit problème pour comparer deux tableaux PHP.
Voici mon premier tableau sorti d'une requête LDAP:
Array(
[0] => Array
(
[Identifiant] => id1
[Nom] => nom1
[Prénom] => prenom1
[NomPrenom] => nomPrenom1
[TitreSpecialite] => titre1
[Service] => service1
[AdresseMail] => adressemail1
[Departement] => departement1
[Company] => company1
[Adresse] => adresse1
[Site] => site1
[TelephoneFixe] => tel1
[TelephonePort] => telport1
)
[0] => Array
(
[Identifiant] => id2
[Nom] => nom2
[Prénom] => prenom2
[NomPrenom] => nomPrenom2
[TitreSpecialite] => titre2
[Service] => service2
[AdresseMail] => adressemail2
[Departement] => departement2
[Company] => company2
[Adresse] => adresse2
[Site] => site2
[TelephoneFixe] => tel2
[TelephonePort] => telport2
)
)
Et voici mon autre tableau sorti d'une requête MySQL :
Array(
[0] => Array
(
[uid] => 4
[identifiant] => id4
[email] => email4
[init] => init4
[nom] => nom4
[prenom] => prenom4
[telephonefixe] => telfixe4
[adresse] => adresse4
[service] => service4
[site] => site4
[telephoneinterne] => telinterne4
[fax] => fax4
)
[1] => Array
(
[uid] => 5
[identifiant] => id5
[email] => email5
[init] => init5
[nom] => nom5
[prenom] => prenom5
[telephonefixe] => telfixe5
[adresse] => adresse5
[service] => service5
[site] => site5
[telephoneinterne] => telinterne5
[fax] => fax5
)
)
Et ce que j'aimerais c'est faire un comparaison. Pour chaque clé ''identifiant'' du tableau LDAP, si celle-ci est égale à une clé ''identifiant'' MySQL on met à jour les informations de la personne concernée dans la base de données MySQL sinon on fais rien. Et enfin si la clé ''identifiant'' LDAP n'existe pas dans une des clés ''identifiant'' MySQL on créé un enregistrement dans la base.
Est-ce possible ? Pourriez-vous m'aider ? Faudrait-il faire un FOREACH dans un FOREACH ?
Merci d'avance.
Romain COUTINEAU.
2 réponses
-
Il y a plusieurs façons de faire:
boucler un tableau et vérifier la valeur avec l'autre.
ou encore utiliser les fonctions de comparaisons de php
http://www.php.net/manual/fr/ref.array.php
array_unique
array_merge
array_intersect
array_uintersect
...-
Je biens de faire ça :
$tabtest[] = array_merge($usersAD,$usersMySQL);
Et quand j'affiche mon tableau il me retourne que les valeurs de mon tableau ''usersAD''.
Et j'ai voulu faire ça :
foreach($usersMySQL as $key =>$users)
{
if($usersMySQL['identifiant'] == $usersAD[$key]['identifiant'])
{
$tabtest[] = array_merge($usersAD,$usersMySQL);
}
}
Et ça ne marche pas non plus est-ce que j'ai oublié quelque chose ? -
déjà il y a plusieurs choses à rectifier avant de poursuivre.
Est-ce que les clés de tableau cité en exemple sont celles que tu utilises ?
Car il y a des soucis à ce niveau : accent, majuscule, elles sont différentes entre mysql et ldap, de fait on risque de ne pas retrouver les mêmes valeurs ...
Si oui, il faudra d'abord normaliser les tableaux avant de les comparer, avec notamment array_change_key_case ()
[Identifiant] => id1 (ldap)
[identifiant] => id4 (mysql)
[Prénom] => id1 (ldap)
[prenom] => id4 (mysql)
corrige:
if($users['identifiant'] == $usersAD[$key]['identifiant']) -
-
Au final si les identifiants sont égaux j'aimerais avoir un tableau unique :
[0] => Array
(
[Identifiant] => id1
[Nom] => nom1
[Prénom] => prenom1
[NomPrenom] => nomPrenom1
[TitreSpecialite] => titre1
[Service] => service1
[AdresseMail] => adressemail1
[Departement] => departement1
[Company] => company1
[Adresse] => adresse1
[Site] => site1
[TelephoneFixe] => tel1
[TelephonePort] => telport1
[uid] => 4
[identifiant] => id4
[email] => email4
[init] => init4
[nom] => nom4
[prenom] => prenom4
[telephonefixe] => telfixe4
[adresse] => adresse4
[service] => service4
[site] => site4
[telephoneinterne] => telinterne4
[fax] => fax4
) -
Méthode foreach:
<?php
$usersAD = array (Array(
"identifiant" => 'id1'),
array(
"identifiant" => 'id2'
));
echo "<pre>";
print_r($usersAD);
echo "</pre>";
$usersMySQL = Array(
Array
(
"identifiant" => 'id2'
),
Array
(
"identifiant" => 'id5'
)
);
echo "<pre>";
print_r($usersMySQL);
echo "</pre>";
echo "<hr />";
$tabtest = array();
foreach($usersAD as $adkey => $ad) {
foreach($usersMySQL as $sql) {
if($ad['identifiant'] == $sql['identifiant']) {
echo $adkey." -> ".$ad['identifiant']. "- > ".$sql['identifiant']."<br />";
$tabtest[] = $adkey;
}
}
}
echo "<pre>";
print_r($tabtest);
echo "</pre>";
?>
-
-
Salut,
Si j'ai bien compris, tu possèdes des enregistrements dans ta base de données, et tu veux soit les mettre a jour(si le même identifiant existe), sinon insérer un nouvel enregistrement.
Pour faciliter l'opération, il vaut mieux que les noms des clés des deux tableaux soient les mêmes.
Donc soit tu changes les noms des clés du tableau contenant le nouvelles informations, soit tu utilises un "Alias" lorsque tu sélectionnes les données de ta base.
Jettes un oeil ici.
Si t'as des questions, n'hésites pas.
Mettez en résolu quand c'est résolu -.- ...