Comparer tableaux a deux dimensions PHP
Résolu
Coutcout86
Messages postés
195
Date d'inscription
Statut
Membre
Dernière intervention
-
coeus Messages postés 3021 Date d'inscription Statut Membre Dernière intervention -
coeus Messages postés 3021 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai un soucis en PHP, j'ai 2 tableaux à 2 dimensions qui sont exactement construit de la même façon mais je n'arrive pas à les comparer. J'ai essayé la fonction array_diff mais elle ne marche pas a priori avec les tableaux deux dimensions. Voici mes deux tableaux :
1er tableau :
2éme tableau :
Est-ce que quelqu'un peut m'aider ??
Merci d'avance.
Romain.
J'ai un soucis en PHP, j'ai 2 tableaux à 2 dimensions qui sont exactement construit de la même façon mais je n'arrive pas à les comparer. J'ai essayé la fonction array_diff mais elle ne marche pas a priori avec les tableaux deux dimensions. Voici mes deux tableaux :
1er tableau :
Array ( [0] => Array ( [nomDuGroupe] => EVERYBODY [permission] => write ) [1] => Array ( [nomDuGroupe] => PERMANENTS [permission] => read ) [2] => Array ( [nomDuGroupe] => ENSMA_PERSONNEL [permission] => write ) [3] => Array ( [nomDuGroupe] => PERMANENTS [permission] => write ) [4] => Array ( [nomDuGroupe] => ENSMA_PERSONNEL [permission] => read ) )
2éme tableau :
Array ( [0] => Array ( [nomDuGroupe] => ALL_PERSONNEL [permission] => read ) [1] => Array ( [nomDuGroupe] => ALL_PERSONNEL [permission] => write ) [2] => Array ( [nomDuGroupe] => EVERYBODY [permission] => read ) [3] => Array ( [nomDuGroupe] => EVERYBODY [permission] => write ) [4] => Array ( [nomDuGroupe] => ENSMA_PERSONNEL [permission] => read ) [5] => Array ( [nomDuGroupe] => ENSMA_PERSONNEL [permission] => write ) )
Est-ce que quelqu'un peut m'aider ??
Merci d'avance.
Romain.
A voir également:
- Tableau deux dimensions php
- Tableau word - Guide
- Tableau ascii - Guide
- Trier un tableau excel - Guide
- Tableau croisé dynamique - Guide
- Imprimer tableau excel sur une page - Guide
7 réponses
Salut !
C'est normal que le array_diff ne retourne rien. J'imagine que tu compares, disons, $tab1 avec $tab2 ? Si c'est le cas, voici ce que le array_diff lit pour chaque tableau :
Donc aucune différence entre les deux, donc résultat vide.
Pour mieux t'aider, il faudrait quelques renseignements de plus...
1. Est-ce que ton but est de comparer $tab1[0] avec $tab2[0], puis $tab1[1] avec $tab2[1], et ainsi de suite ? Ou tu veux poser la question : "Est-ce que $tab1[0] se retrouve quelque part dans $tab2 ?" suivi de "Est-ce que $tab1[1] se retrouve quelque part dans $tab2 ?", et ainsi de suite ?
2. Est-ce qu'il est possible que les tableaux contiennent d'autres valeurs, ou plus de valeurs, ou moins de valeurs, que ce que tu nous présentes ? Ou sont-ils parfaitement statiques, et donc ils auront toujours la même valeur, quoiqu'il arrive ?
Avec ça, on devrait arriver à quelque chose ! ;-)
C'est normal que le array_diff ne retourne rien. J'imagine que tu compares, disons, $tab1 avec $tab2 ? Si c'est le cas, voici ce que le array_diff lit pour chaque tableau :
$tab1 = array( Array(), Array(), Array(), Array() ); $tab2 = array( Array(), Array(), Array(), Array() );
Donc aucune différence entre les deux, donc résultat vide.
Pour mieux t'aider, il faudrait quelques renseignements de plus...
1. Est-ce que ton but est de comparer $tab1[0] avec $tab2[0], puis $tab1[1] avec $tab2[1], et ainsi de suite ? Ou tu veux poser la question : "Est-ce que $tab1[0] se retrouve quelque part dans $tab2 ?" suivi de "Est-ce que $tab1[1] se retrouve quelque part dans $tab2 ?", et ainsi de suite ?
2. Est-ce qu'il est possible que les tableaux contiennent d'autres valeurs, ou plus de valeurs, ou moins de valeurs, que ce que tu nous présentes ? Ou sont-ils parfaitement statiques, et donc ils auront toujours la même valeur, quoiqu'il arrive ?
Avec ça, on devrait arriver à quelque chose ! ;-)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Le premier vient d'une requete sql :
et le deuxième vient d'un formulaire contenant des cases à cocher pour chaque nom de groupe ( deux cases à cocher par groupe) et ensuite sur ces cases à cocher je fais une RegEx pour dissocier le nom du groupe avec sa permissionv :
Dit moi si tu ne comprend pas !
$query_supprPerm = "SELECT dn as nomDuGroupe,typeAcces as permission FROM ACL WHERE refIndex='".$queryindexFichierACL[0]['id']."' AND (".$sql.")"; $resultSupprPerm = $supprPermModel->requete($query_supprPerm);
et le deuxième vient d'un formulaire contenant des cases à cocher pour chaque nom de groupe ( deux cases à cocher par groupe) et ensuite sur ces cases à cocher je fais une RegEx pour dissocier le nom du groupe avec sa permissionv :
//Pour chaque clé du tableau formValues, on décompose le nom de la clé en trois partie avec une RegEx([0]=> read__NomDuGroupe,[1]=>read,[2]=>__,[3]=>NomDuGroupe) foreach($formValues as $key=>$champForm) { if((preg_match("!(^read)(__*)(\\D{0,})!", $key, $result1) || preg_match("!(^write)(__*)(\\D{0,})!", $key, $result1))) { $tabResultRegEx = array("nomDuGroupe" => $result1[3], "permission" => $result1[1]); $tabFormValues[] = $tabResultRegEx; $tabPermission = array_values($tabFormValues); } }
Dit moi si tu ne comprend pas !
Je n'ai pas tellement lu comment tu as fait ton code pour arriver à tes deux tableaux finaux... Mais ce que je ne comprends pas, c'est pourquoi tu as choisi d'adopter cette forme.
Moi, à ta place, au lieu de :
Je m'arrangerais pour avoir ça sous la forme de :
Ou, au gros minimum :
Ça éviterait les répétitions et ce serait beaucoup plus facile de comparer. Mais peut-être que ce ne serait pas faisable pour toi, pour une raison quelconque ? Je te laisse répondre à ça avant d'aller plus loin. ;-)
Moi, à ta place, au lieu de :
Array ( [0] => Array ( [nomDuGroupe] => EVERYBODY [permission] => write ) [1] => Array ( [nomDuGroupe] => PERMANENTS [permission] => read ) [2] => Array ( [nomDuGroupe] => ENSMA_PERSONNEL [permission] => write ) [3] => Array ( [nomDuGroupe] => PERMANENTS [permission] => write ) [4] => Array ( [nomDuGroupe] => ENSMA_PERSONNEL [permission] => read ) )
Je m'arrangerais pour avoir ça sous la forme de :
Array( [EVERYBODY] => Array(write) [PERMANENTS] => Array(write, read) [ENSMA_PERSONNEL] => Array(write, read) )
Ou, au gros minimum :
Array ( [0] => Array ( [nomDuGroupe] => EVERYBODY [permissions] => Array(write) ) [1] => Array ( [nomDuGroupe] => PERMANENTS [permissions] => Array(write, read) ) [2] => Array ( [nomDuGroupe] => ENSMA_PERSONNEL [permissions] => Array(write, read) ) )
Ça éviterait les répétitions et ce serait beaucoup plus facile de comparer. Mais peut-être que ce ne serait pas faisable pour toi, pour une raison quelconque ? Je te laisse répondre à ça avant d'aller plus loin. ;-)
Ouai donc du coup je peux pas tester à partir de mon poste...
doit y avoir une erreur dans tes tableaux parce normalement le array_diff peut calculer la différence entre des tableaux à 2 dimensions
Voir le lien suivant : http://www.lephpfacile.com/manuel-php/function.array-diff.php
doit y avoir une erreur dans tes tableaux parce normalement le array_diff peut calculer la différence entre des tableaux à 2 dimensions
Note: Notez que cette fonction ne vérifie qu'une dimension d'un tableau à plusieurs dimensions. Bien sûr, vous pouvez vérifier des dimensions plus profondes en utilisant array_diff($array1[0], $array2[0]);.
Voir le lien suivant : http://www.lephpfacile.com/manuel-php/function.array-diff.php
Y a pas d'erreur... Ta solution marcherait en effet, si ce n'était que, de ce que je comprends, il ne veut pas comparer deux arrays bien spécifiques. Il ne veut pas savoir nécessairement la différence entre $array1[0] et $array2[0] ; il veut savoir si $array1[0] se retrouve quelque part dans $array2 et, si c'est le cas, s'ils sont différents. Dans le fond, on compare $array1[x] avec $array2[x], où x peut prendre bien des valeurs. Ce serait long et compliqué avec array_diff. Il y a certainement une méthode plus propre, selon ses besoins.
Pour répondre a ta question coeus et pour que tu comprenne un peu le sens de mon code mon premier tableau va être insérer dans une base de données donc pour chaque item (ou clé) j'insére nomDuGroupe dans un champs et permission dans un autre. Mais avant d'insérer ce tableau , il faut que je vérifie si les permissions et les groupes associés ne sont pas déjà dans la BDD donc je fais une requête qui me sort un autre tableau (le 2éme en l'occurence). Et donc je dois les comparer pour en sortir un troisième tableau que je mettrai lui dans la BDD.
Est ce que tu comprend mieux ou pas ?
Merci d'avance.
Romain.
Est ce que tu comprend mieux ou pas ?
Merci d'avance.
Romain.
Oui, je comprends beaucoup mieux, merci. :-)
Bon dans ce cas je pense qu'on ne s'en sortira pas, la solution va être un bon vieux foreach().
Note : je n'ai pas testé... Tu me diras s'il y a une erreur que tu ne comprends pas. Mais la logique est là.
Ceci dit, tu as une manière de faire très valable... Mais as-tu songé aussi à la possibilité de faire un foreach() qui parcourt ton $array1, et que pour chaque élément que ça te sort, qui fait une requête SQL différente pour voir si ça existe dans la BDD avant de faire d'autres opérations ? Je ne sais pas si je suis clair...
Note que ce que je te propose n'est pas conseillé si tu penses te retrouver éventuellement avec plusieurs (au moins quelques centaines) d'entrées à comparer. Mais si tu restes dans l'ordre des dizaines et moins comme actuellement, ça pourrait aussi marcher.
Remarque, chacun son paradigme ! ;-)
Dis-moi si ma solution fait du sens !
Bon dans ce cas je pense qu'on ne s'en sortira pas, la solution va être un bon vieux foreach().
foreach ($array1 as $key => $localElement) { $isFound = false; foreach ($array2 as $cle => $dbElement) { if ($localElement['nomDuGroupe'] == $dbElement['nomDuGroupe'] && $localElement['permission'] == $dbElement['permission']) { $isFound = true; } } if ($isFound) { echo "Requête annulée, l'élément est déjà présent dans la BDD." } else { echo "Requête en cours..." } }
Note : je n'ai pas testé... Tu me diras s'il y a une erreur que tu ne comprends pas. Mais la logique est là.
Ceci dit, tu as une manière de faire très valable... Mais as-tu songé aussi à la possibilité de faire un foreach() qui parcourt ton $array1, et que pour chaque élément que ça te sort, qui fait une requête SQL différente pour voir si ça existe dans la BDD avant de faire d'autres opérations ? Je ne sais pas si je suis clair...
Note que ce que je te propose n'est pas conseillé si tu penses te retrouver éventuellement avec plusieurs (au moins quelques centaines) d'entrées à comparer. Mais si tu restes dans l'ordre des dizaines et moins comme actuellement, ça pourrait aussi marcher.
Remarque, chacun son paradigme ! ;-)
Dis-moi si ma solution fait du sens !
Sa m'a l'air correcte j'ai pas tester mais si en gros les permissions d'un groupe sont déjà dans la base, je voudrais supprimer ceux qui sont dedans la BDD et mettre entre guillemets "les nouveaux" comment je fais?
Et dans le else ensuite je fais ma requête SQL mais avec quelles valeurs? Et faut-il que je fasse un foreach dans le else ?
Enfaite si je suis ton code et la logique que je veux mettre en place c'est si les permissions ne sont pas égales mais que le groupe est égal ( c'est à dire que dans ma base de données je peux pas mettre deux permissions différentes pour un même groupe) dans ce cas on supprime l'enregistrement dans la BDD et on enregistre la nouvelle permission sinon si c'est égal on supprime les enregistrement de la BDD et on ajoute les nouvelles permissions.
Tu comprends? Si oui comment pourrait-je faire?
Merci d'avance.
Romain.
Et dans le else ensuite je fais ma requête SQL mais avec quelles valeurs? Et faut-il que je fasse un foreach dans le else ?
Enfaite si je suis ton code et la logique que je veux mettre en place c'est si les permissions ne sont pas égales mais que le groupe est égal ( c'est à dire que dans ma base de données je peux pas mettre deux permissions différentes pour un même groupe) dans ce cas on supprime l'enregistrement dans la BDD et on enregistre la nouvelle permission sinon si c'est égal on supprime les enregistrement de la BDD et on ajoute les nouvelles permissions.
Tu comprends? Si oui comment pourrait-je faire?
Merci d'avance.
Romain.
Oui, tout à fait. Ça se fait très bien. Mieux : pas besoin de rien supprimer.
Dans le foreach(), au point où on met $isFound = true; tu peux plutôt faire :
Et plus loin, si $isFound égale à false, ça veut dire que la valeur n'a pas été trouvée ; ça ce moment-là tu fais un INSERT dans ta BDD.
Encore là, je n'ai pas testé le code, mais le but est surtout de te donner la logique, pas la formule précise...
Référence pour le UPDATE
Est-ce que ça t'aide ?
Dans le foreach(), au point où on met $isFound = true; tu peux plutôt faire :
if (...) { $isFound = true; $requete = 'UPDATE table_name SET nomDuGroupe='.$localElement['nomDuGroupe'].', permission='.$localElement['permission'].' WHERE nomDuGroupe='.$dbElement['nomDuGroupe'].' AND permission='.$dbElement['permission'].';'; // Et le reste de ce qu'il faut pour effectuer la requête... }
Et plus loin, si $isFound égale à false, ça veut dire que la valeur n'a pas été trouvée ; ça ce moment-là tu fais un INSERT dans ta BDD.
Encore là, je n'ai pas testé le code, mais le but est surtout de te donner la logique, pas la formule précise...
Référence pour le UPDATE
Est-ce que ça t'aide ?
Héhéhé... Ne le prends pas mal, mais les jours où je ne sais pas quoi faire, je les compte sur les doigts d'une main... Entre la job, ma copine, mes amis, le kung fu, Starcraft et mes nécessités de survie (apparemment, manger est assez important)... J'ai déjà essayé avec un autre membre CCM, et je crois que je me suis connecté trois fois à MSN depuis ce temps (ça fait environ 8 mois).
Ça m'aurait fait plaisir, mais je suis moins que fiable sur mes disponibilités... Tu ferais mieux de te trouver quelqu'un qui risque d'exister une fois de temps en temps ! ;-)
J'attends ta réponse à savoir si tout fonctionne comme tu veux ! :-)
Ça m'aurait fait plaisir, mais je suis moins que fiable sur mes disponibilités... Tu ferais mieux de te trouver quelqu'un qui risque d'exister une fois de temps en temps ! ;-)
J'attends ta réponse à savoir si tout fonctionne comme tu veux ! :-)
Et pour la deuxième question les clés des tableaux varie c'est à dire que $tab1 et $tab2 peuvent avoir $tab1[0], $tab1[1], $tab1[2], $tab1[3] etc... et $tab2[0], $tab2[1], $tab2[2], $tab2[3] etc... En revanche le contenu de la clé de change pas il y aura toujours deux valeurs (nomDuGroupe, permission).
J'espère avoir répondu a ta question
Merci d'avance.
Romain