Comparer un tableau avec plusieurs autres (tableaux)

Fermé
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 - 2 avril 2013 à 17:55
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 - 15 avril 2013 à 18:32
Bonjour,

aprés la création de mon tableau à deux dimension je voudrais comparer les élément pour éliminer ceux qui sont en plusieurs fois je sais que c'est avec array_intersect mais je ne sais pas comment quand il s'agit de comparer à chaque fois les élément d'un tableaux avec des autres tableaux

Merci pour votre aide
A voir également:

17 réponses

JooS Messages postés 2468 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
2 avril 2013 à 22:56
Salut,
Donne un exemple de ton tableau !

0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
3 avril 2013 à 09:09
Bonjour,

par exemple j'ai mon tableau

([0]=nom de fichier 1
[0][0]=contenu de fichier 1 par exemple "alain"
[0][1]=les autre données comme " alex"
[0][2]=natalie
[1]=nom de fichier2
[1][0]=contenu de fichier 2 par exemple "alain"
[1][1]=les autre données comme " pomme"
[1][2]="maison"
.
.
.
[2]=nom de fichier 3)
.
.
.
et à chaque je compare le contenu de fichier 1 avec les autres fichiers;
est ce que ça est possible!!
merci d'avance
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
3 avril 2013 à 08:36
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
3 avril 2013 à 09:35
Bonjour,

merci pour ton exemple mais ça marche pas avec mon cas
0
JooS Messages postés 2468 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
3 avril 2013 à 13:14
Salut,

apparemment c'est pas trés correct, ça devrait plutôt être comme ça !

[0][0] = 'nom de fichier 1';
[0][1] = 'contenu de fichier 1 par exemple "alain"';
[0][2] = 'les autre données comme " alex"';
[0][3] = 'natalie';

[1][0] = 'nom de fichier 2';
[1][1] = 'contenu de fichier 2 par exemple "alain"';
[1][2] = 'les autre données comme " pomme"';
[1][3] = 'maison';

[2][0] = 'nom de fichier 3';
[2][1] = 'contenu de fichier 1 par exemple "alain"';
[2][2] = 'les autre données comme " alex"';
[2][3] = 'natalie';



Ou encore mieux comme ça ...

array(
    'nom de fichier 1' => array(
        'contenu de fichier 1 par exemple "alain"',
        'les autre données comme " alex"',
        'natalie'
    ),

    'nom de fichier 2' => array(
        'contenu de fichier 2 par exemple "alain"',
        'les autre données comme " pomme"',
        'maison'
    ),

    'nom de fichier 3' => array(
        'contenu de fichier 1 par exemple "alain"',
        'les autre données comme " alex"',
        'natalie'
    )
);


Tu n'as pas donner d'exemple concernant les élément répétés !

Et je doute que "array_intersect" compare les sous tableaux.
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
3 avril 2013 à 13:23
Bnj

Merci JooS oui c'est comme tu l'as décrit dans le deuxième cas par exemple "alain "est répété donc je le récupère dans un autre tableau;
mais je ne sais pas comment!!!
0
JooS Messages postés 2468 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 3/04/2013 à 13:48
Est ce que la clé du tableau identifie les éléments ?
Par exemple, est ce que "alain" appartient forcement au fichier 1, ou peut appartenir a plusieurs fichiers ?

Si la clé est un identifiant, alors tu peut utiliser array_intersect !
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
3 avril 2013 à 13:51
"alain" par exemple doit apparaître juste dans fichier 1 c'est pour ça que je doive faire l'intersection pour voir est ce qu'il est dans des autres sous tableaux et a chaque fois je compare le contenu de fichier1 avec les autres sous tableau; mon tableau est sous forme:
array(
[0]=>array(
[0]=>alain
[1]=>natalie
.
.
.
)
[1]=>array(
[0]=>alain
[1]=>pomme
[2]=>banane
.
.
.
)
.
.
.
)
0
JooS Messages postés 2468 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
3 avril 2013 à 13:59
Bon, j'ai pas tout compris, mais bon, essaye ceci !

$tab = array(
    'nom de fichier 1' => array(
        'contenu de fichier 1 par exemple "alain"',
        'les autre données comme " alex"',
        'natalie'
    ),

    'nom de fichier 2' => array(
        'contenu de fichier 2 par exemple "alain"',
        'les autre données comme " pomme"',
        'maison'
    ),

    'nom de fichier 1' => array(
        'contenu de fichier 1 par exemple "alain"',
        'les autre données comme " alex"',
        'natalie'
    )
);

$tab1 = $tab;
$tab = array_intersect($tab, $tab1);

var_dump($tab);
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
3 avril 2013 à 14:21
Merci pour ta réponse mais comme ça il affiche tout les éléments de sous tableaux vu que tab1=tab ensuite on fait l'intersection donc c'est l'intersection avec lui même
il m'affiche tout le contenu
0
JooS Messages postés 2468 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 3/04/2013 à 15:03
Non, il n'affiche pas les répétitions, ce n'est pas ce que tu voulais ?!
0

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

Posez votre question
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
4 avril 2013 à 13:04
salut,

j'ai bricolé ça est ce que ça fonctionne pour toi, attention l'array tel que tu le donne doit être modifié, (comme le dit JooS)

<?php

$tab=array();

$tab[0][0]="nom de fichier 1"; //la il faut que ce soit comme ça
$tab[0][1]="alain";
$tab[0][2]="alex";
$tab[0][3]="natalie";
$tab[1][0]="nom de fichier2";
$tab[1][1]="alain";
$tab[1][2]="pomme";
$tab[1][3]="maison";

echo '<pre>';
print_r($tab);
echo '</pre>';

$tab2=array();

foreach($tab as $cle=>$value){	
	if(is_array($value)){
		for($t=1;$t<sizeof($value);$t++){
			//on verifie que chaque valeur du sous array n'est pas dans les autres sous array $t=1 donc le suivant
			if(($cle+1) < sizeof($tab) && !in_array($value[$t],$tab[$cle+1])){
				//limite de verif à $cle+1
				$tab2[$cle][]=$value[$t];
			}else if(($cle+1) == sizeof($tab)){
				//la on prend le dernier tel quel, puisque les précédents ont été vérifiés par rapport à lui
				$tab2[$cle][]=$value[$t];
			}
		}
	}
}

echo '<pre>';
print_r($tab2);
echo '</pre>';
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
4 avril 2013 à 13:18
merci pour ta réponse mais il ne y a rien qui s'affiche!!!
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
Modifié par Alain_42 le 4/04/2013 à 13:44
as tu modifié ton array ?


si tu fais un essai avec le script tel que je t'ai donné ça marche.
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
4 avril 2013 à 13:56
j'ai juste enlevé car je l'ai déjà récupéré
$tab=array();

$tab[0][0]="nom de fichier 1"; //la il faut que ce soit comme ça
$tab[0][1]="alain";
$tab[0][2]="alex";
$tab[0][3]="natalie";
$tab[1][0]="nom de fichier2";
$tab[1][1]="alain";
$tab[1][2]="pomme";
$tab[1][3]="maison";

echo '<pre>';
print_r($tab);
echo '</pre>'
et rien ne s'affiche
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
4 avril 2013 à 19:44
tu n'as rie du tout ? même pas d'erreur

même pas array()
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
8 avril 2013 à 10:50
Bonjour;
merci Alain pour ta réponse mais ton code ne marche pas. J'ai tenté ça :

while($i!=31){
for($i=0;$i<$nb;$i++){
for ($j=0;$j<count($tab[$i]); $j++)
{
$tab2$i][$j]= array_intersect($tab[31], $tab[$i]);

//tab[31] c'est le sous tableau avec qui je voudrai comparer les autres sous tableau

$nbd=$nbd+1;
}
}
}

print_r($tab2);

mais toujours ça marche pas :(
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
8 avril 2013 à 14:28
est ce que il faut créer une classe pour comparer les sous tableaux ou quoi!!!
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
8 avril 2013 à 17:54
j'ai fait ça:

while($i!=10)
{
for($i=0; $i<$nb; $i++)
{
for($j=0;$j<count($tab[$i]); $j++)
{
$ma=$tab[10];

while($i!=10)
{
$tab[$i]= array_intersect($ma, $tab$i]);

if(in_array($ma, $tab[$i])){
$nbd=$nbd+1;}



}
mais toujours sans succès et je ne sais pas pourquoi
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
8 avril 2013 à 18:19
ce script fonctionne chez moi
<?php

$tab=array();

$tab[0][0]="nom de fichier 1"; //la il faut que ce soit comme ça
$tab[0][1]="alain";
$tab[0][2]="alex";
$tab[0][3]="natalie";
$tab[1][0]="nom de fichier2";
$tab[1][1]="alain";
$tab[1][2]="pomme";
$tab[1][3]="maison";

echo '<pre>';
print_r($tab);
echo '</pre>';

$tab2=array();

foreach($tab as $cle=>$value){	
	if(is_array($value)){
		for($t=1;$t<sizeof($value);$t++){
			//on verifie que chaque valeur du sous array n'est pas dans les autres sous array $t=1 donc le suivant
			if(($cle+1) < sizeof($tab) && !in_array($value[$t],$tab[$cle+1])){
				//limite de verif à $cle+1
				$tab2[$cle][]=$value[$t];
			}else if(($cle+1) == sizeof($tab)){
				//la on prend le dernier tel quel, puisque les précédents ont été vérifiés par rapport à lui
				$tab2[$cle][]=$value[$t];
			}
		}
	}
}

echo '<pre>';
print_r($tab2);
echo '</pre>';
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
8 avril 2013 à 18:28
chez moi aussi ça fonctionne tel qu'il est mais dés que je l'applique sur mon tableau ça ne fonctionne plus!!!
:(
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
8 avril 2013 à 21:35
comment est ton tableau ?
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
Modifié par Elodie_79 le 9/04/2013 à 09:13
Bonjour;

Mon tableau est sous forme:

[0] => Array
(
[0] => Array
( [0]=>hg
)

)

[1] => Array
(
[0] => Array
(
[0] => htm
)

)

[2] => Array(
( [0]=>h
)
) [1] => Array
(
[0] => Array
( [0]=>hg
)

)

[1] => Array
(
[0] => Array
(
[0] => htm
)

)

[2] => Array(
( [0]=>hk
)
) hg est l'élément répété et il est comme vu que je les récupéré avec preg match all
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
9 avril 2013 à 14:28
impossible a traiter ton array, il n'est pas homogène

$tab[0] => Array([0] => Array( [0]=>'hg'));
$tab[1] => Array([0] => Array([0] => 'htm'));
$tab[2] => Array(( [0]=>'h')) [1] => Array([0] => Array( [0]=>'hg'));
$tab[1] => Array([0] => Array([0] => 'htm'));
$tab[2] => Array(( [0]=>'hk'));


certains index ont deux dimensions, d'autres 3 d'autres une
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
9 avril 2013 à 15:07
non ce n'est pas comme t'as compris car juste quand je tape sur"Entrée" il se décale sinon
$tab[0] => Array([0] => Array( [0]=>array([0]=>kj)));
Array([1] => Array( [0]=>array([0]=>h));
$tab[1]=>...(c'est toujours la même chose ) il est complique comme ça car ses données je les ai récupéré avec un preg match all je voulais simplifier avant de faire la comparaison mais j'ai pas pu j'ai fait array_push($tab1; $tab) pour simplifier mais ça n'a pas marché
0
JooS Messages postés 2468 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
9 avril 2013 à 18:26
Salut,

@Elodie_79 Tu dis que tu importe ces textes a partir de fichiers ? peut on voir le script d'importation !
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
9 avril 2013 à 18:27
et si tu fais plusieurs boucles imbriquées (autant que de niveaux de ton array) ?
foreach($tab as $cle1=>$value1){
	foreach($value1 as $cle2=>$value2){
		foreach($value2 as $cle=>$value){
			if(is_array($value)){
				for($t=1;$t<sizeof($value);$t++){
					//on verifie que chaque valur du sous array n'est pas dans les autres sous array $t=1 donc le suivant
					if(($cle+1) < sizeof($tab) && !in_array($value[$t],$tab[$cle+1])){
						//limite de verif à $cle+1
						$tab2[$cle][]=$value[$t];
					}else if(($cle+1) == sizeof($tab)){
						//la on prend le dernier tele quel, puisque les précédents ont été verifiés par rapport à lui
						$tab2[$cle][]=$value[$t];
					}
				}
			}
		}
	}
}
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
9 avril 2013 à 18:53
avec ce code il affiche comme ça

Array
(
[0] => Array
(
[0] => az
[1] => d
[2] =>dr
[3] => hg
[4] => gf
[5] => gg
[6] => ggh
[7] => htt
[8] => hnh
)

)
je sais que c'est pas tout il manque quelque chose dans le code comme une boucle au quoi en plus il faut comparer u tableau qui sera toujours le meme avec des autres et pas une comparaison entre eux (entre tout les tableau: comparer tab 1 avec tab2 ensuite tab 1 avec tab 3 ainsi de suite et il faut pas comparer 2 et 3 par exemple)
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
9 avril 2013 à 21:45
dans ton premier post tu mets:
aprés la création de mon tableau à deux dimension je voudrais comparer les élément pour éliminer ceux qui sont en plusieurs fois

on est rendu maintenant à un tableau à 4 ou 5 dimensions
et si tu compares seulement le premier array avec tous les autres, si une valeur est dans le 3 ième et dans le 5 ième le doublon ne sera pas éliminé
0
Azraka Messages postés 252 Date d'inscription mercredi 11 juin 2008 Statut Membre Dernière intervention 5 juin 2014 13
Modifié par Azraka le 10/04/2013 à 13:42
Peut-être que tu ne prends pas le problème par le bon bout :

Si tu as besoin de comparer entre elles les valeurs des différentes dimensions d'un tableau, c'est qu'elles ne sont peut-être pas nécessaires. Tu dois pouvoir faire ça avec un tableau à une seule dimension.

Peux-tu nous expliquer ce que tu fais, peut-être un exemple de ton code ?

--
:(){ :|:& };:
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
10 avril 2013 à 14:09
Bonjour,
j'ai récupéré des données qui se trouvent dans des fichiers différents dans un tableau à deux dimensions(à deux dimensions car j'ai besoins de comparer les données d'un fichier X avec les données de tout le reste des fichier ) c'est pour ça quand j'ai récupéré mes données dans ce tableaux à deux dimensions avec un preg match all donc j'ai obtenu cette affichage de mon tableau:
[0] => Array
(
[0] => Array
( [0]=>hg
)

)

[1] => Array
(
[0] => Array
(
[0] => htm
)

)

[2] => Array(
( [0]=>h
)
) [1] => Array
(
[0] => Array
( [0]=>hg
)

)

[1] => Array
(
[0] => Array
(
[0] => htm
)

)

[2] => Array(
( [0]=>hk
)
donc d'après cet affichage ça veut dire qu'il est devenu un tableau à 4 dimension ou quoi car après ça devient difficile pour faire cette comparaison !!
0
Azraka Messages postés 252 Date d'inscription mercredi 11 juin 2008 Statut Membre Dernière intervention 5 juin 2014 13
10 avril 2013 à 15:07
Il faudrait que tu fasses des traitements sur les résultats de ton preg_match_all pour reformer des tableaux à 1.
Là je pense que tu récupères de manière brute ce que tu renvoies la fonction.

Peut-on voir le code qui génère ce tableau ? Notamment avec le preg_match_all.
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
10 avril 2013 à 15:27
j'ai récupéré le contenu de tout les fichiers dans un tableau à deux dimensions:
ensuite et à l'aide de preg match all jai extrait ques les URL
for ($i=0; $i<$taile; $i++)
{
for ($j=0; $j<count($tab[$i]); $j++){

if(preg_match_all('/https?:\/\/[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/i', $tab[$i][$j], $url[$i][$j]))
{

$n=$n+1;



}
}
}
echo $n; //nobre de tout les URL

print_r($url])
ensuite je voudrais faire la comparaision
0
Azraka Messages postés 252 Date d'inscription mercredi 11 juin 2008 Statut Membre Dernière intervention 5 juin 2014 13
Modifié par Azraka le 10/04/2013 à 16:26
Alors déjà, utilise des foreach pour parcourir tes tableaux, ce sera beaucoup plus simple et lisible. Ca t'évitera aussi de mettre les résultats des preg_match_all dans des trucs comme $url[$i][$j]. C'est de là que viennent toutes tes dimensons en trop.

J'allais te faire un exemple de comment je ferais ça, mais je me rend compte que je n'ai toujours pas compris ce que tu veux faire.

Peux-tu nous détailler ce à quoi tu veux arriver ?
J'ai compri que tu récupères du contenu de plusieurs fichiers, et qu'après tu veux comparer les urls. Mais tu veux quoi exactement à la fin ?

- Avoir une seule liste des urls présente dans l'ensemble des fichiers, le tout sans doublons ?
- Avoir autant de listes que de fichier, avec à l'intérieur les urls présente dans le fichier ?

Si jamais c'est le deuxième cas, je ne vois pas selon quelle logique tu voudrais dédoublonner la liste : si une url est présente dans le fichier 1 et le fichier 2, comment sait si il faut la garder dans la liste du fichier 1 ou la liste du fichier 2 ?


Désolé d'insister et de poser toujours plus de question mais pour bien t'aider il faut absolument qu'on comprenne bien ce que tu attends.
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
Modifié par Elodie_79 le 10/04/2013 à 16:47
oui c'est le deuxième cas et à chaque fois je voudrais comparer le contenu de fichier 1 avec les autres fichiers ensuite toujours j'élimine les doublons dans le fichiers 1 le but c'est de réduire sa taille vu que les données sont catégorisées dans des autres fichiers c'est ça mon but
merci d'avance
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
Modifié par Alain_42 le 11/04/2013 à 18:30
ha alors essaies comme ça:
foreach($tab as $cle1=>$value1){ 
 foreach($value1 as $cle2=>$value2){ 
  foreach($value2 as $cle=>$value){ 
   if(is_array($value)){ 
    for($t=1;$t<sizeof($value);$t++){ 
     //on verifie que chaque valur du sous array n'est pas dans les autres sous array $t=1 donc le suivant 
     if(($cle+1) < sizeof($tab) && !in_array($value[0],$tab[$cle+1])){ //juste cette ligne chagée $value[$t] remplacé par $value[0] 
      //limite de verif à $cle+1 
      $tab2[$cle][]=$value[0]; 
     }
    } 
   } 
  } 
 } 
}
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
15 avril 2013 à 09:14
Merci pour tes essais mais toujours ça marche pas
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
15 avril 2013 à 18:14
donnes nous un exemple de preg_match_all que tu utilises

et utilises tu $out[0]

ou $out[1]
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
15 avril 2013 à 18:16
slt voila mon preg match all
if(preg_match_all('/https?:\/\/[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/i', $tab[$i][$j], $url[$i][$j]))
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
15 avril 2013 à 18:25
a quoi correspondent ces compteurs $i $j ?
0
Elodie_79 Messages postés 73 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 13 mars 2014 2
15 avril 2013 à 18:32
car mon tableau là où je dois récupérer mes données est un tableau à deux dimensions
0