Comparer tableaux a deux dimensions PHP

Résolu/Fermé
Coutcout86 Messages postés 195 Date d'inscription lundi 23 novembre 2009 Statut Membre Dernière intervention 26 mai 2016 - 20 avril 2011 à 11:07
coeus Messages postés 3019 Date d'inscription samedi 13 janvier 2007 Statut Membre Dernière intervention 19 juin 2013 - 21 avril 2011 à 17:12
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 :

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:

7 réponses

coeus Messages postés 3019 Date d'inscription samedi 13 janvier 2007 Statut Membre Dernière intervention 19 juin 2013 119
20 avril 2011 à 13:26
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 :
$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 ! ;-)
2
Coutcout86 Messages postés 195 Date d'inscription lundi 23 novembre 2009 Statut Membre Dernière intervention 26 mai 2016
20 avril 2011 à 13:42
Pour répondre à ta première question, je veux savoir si $tab1[0] se trouve quelque part dans $tab2 suivi de $tab[1] se trouve quelque part dans $tab2.

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
0
Melooo Messages postés 1405 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 18 mars 2013 84
20 avril 2011 à 11:18
Salut,
Le array_diff te retourne quoi ?
0
Coutcout86 Messages postés 195 Date d'inscription lundi 23 novembre 2009 Statut Membre Dernière intervention 26 mai 2016
20 avril 2011 à 11:50
rien il me retourne un tableau vide ! Donc je ne sais pas comment faire
0
Melooo Messages postés 1405 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 18 mars 2013 84
20 avril 2011 à 12:02
Peux tu me donner le code de tes tableaux, j'ai la flemme de réécrire moi même :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Coutcout86 Messages postés 195 Date d'inscription lundi 23 novembre 2009 Statut Membre Dernière intervention 26 mai 2016
20 avril 2011 à 13:34
Le premier vient d'une requete sql :

$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 !
0
coeus Messages postés 3019 Date d'inscription samedi 13 janvier 2007 Statut Membre Dernière intervention 19 juin 2013 119
Modifié par coeus le 20/04/2011 à 13:45
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 :

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. ;-)
0
Melooo Messages postés 1405 Date d'inscription vendredi 28 novembre 2008 Statut Membre Dernière intervention 18 mars 2013 84
20 avril 2011 à 13:45
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
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
0
coeus Messages postés 3019 Date d'inscription samedi 13 janvier 2007 Statut Membre Dernière intervention 19 juin 2013 119
20 avril 2011 à 13:51
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.
0
Coutcout86 Messages postés 195 Date d'inscription lundi 23 novembre 2009 Statut Membre Dernière intervention 26 mai 2016
Modifié par Coutcout86 le 20/04/2011 à 14:10
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.
0
coeus Messages postés 3019 Date d'inscription samedi 13 janvier 2007 Statut Membre Dernière intervention 19 juin 2013 119
20 avril 2011 à 14:13
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().

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 !
0
Coutcout86 Messages postés 195 Date d'inscription lundi 23 novembre 2009 Statut Membre Dernière intervention 26 mai 2016
20 avril 2011 à 14:24
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.
0
coeus Messages postés 3019 Date d'inscription samedi 13 janvier 2007 Statut Membre Dernière intervention 19 juin 2013 119
20 avril 2011 à 14:34
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 :
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 ?
0
Coutcout86 Messages postés 195 Date d'inscription lundi 23 novembre 2009 Statut Membre Dernière intervention 26 mai 2016
20 avril 2011 à 15:35
Merci beaucoup je suis sur un autre chantier (CMS Spip) je teste cela et je te donne une réponse !! Si tu veux j'ai msn on pourrait dialoguer PHP si tu veux les jours où on ne sait pas quoi faire !!
0
coeus Messages postés 3019 Date d'inscription samedi 13 janvier 2007 Statut Membre Dernière intervention 19 juin 2013 119
20 avril 2011 à 16:43
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 ! :-)
0
Coutcout86 Messages postés 195 Date d'inscription lundi 23 novembre 2009 Statut Membre Dernière intervention 26 mai 2016
21 avril 2011 à 10:57
Slt coeus, je viens de tester le petit bout de code que tu m'a suggéré mais cela ne marche pas, il ne fait que ajouter c'est à dire qu'il ne met pas à jour un enregistrement s'il existe. Il ne fait que ajouter. Pourrait-tu m'aider?
0
coeus Messages postés 3019 Date d'inscription samedi 13 janvier 2007 Statut Membre Dernière intervention 19 juin 2013 119
21 avril 2011 à 17:12
Peux-tu me poster ton code exact ?
Et as-tu essayé de vérifier seulement le SQL, voir s'il détecte si une valeur existe ? Pour moi c'est un peu dur à faire vu que je n'ai pas ta BDD avec moi ; peut-être que c'est la requête SQL qui cherche les entrées existantes qui est fautive...
0