Comparer un tableau avec plusieurs autres (tableaux)

Elodie_79 Messages postés 73 Date d'inscription   Statut Membre Dernière intervention   -  
Elodie_79 Messages postés 73 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   228
 
Salut,
Donne un exemple de ton tableau !

0
Elodie_79 Messages postés 73 Date d'inscription   Statut Membre Dernière intervention   2
 
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   Statut Membre Dernière intervention   894
 
0
Elodie_79 Messages postés 73 Date d'inscription   Statut Membre Dernière intervention   2
 
Bonjour,

merci pour ton exemple mais ça marche pas avec mon cas
0
JooS Messages postés 2468 Date d'inscription   Statut Membre Dernière intervention   228
 
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   Statut Membre Dernière intervention   2
 
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   Statut Membre Dernière intervention   228
 
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   Statut Membre Dernière intervention   2
 
"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   Statut Membre Dernière intervention   228
 
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   Statut Membre Dernière intervention   2
 
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   Statut Membre Dernière intervention   228
 
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   Statut Membre Dernière intervention   894
 
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   Statut Membre Dernière intervention   2
 
merci pour ta réponse mais il ne y a rien qui s'affiche!!!
0
Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   894
 
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   Statut Membre Dernière intervention   2
 
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   Statut Membre Dernière intervention   894
 
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   Statut Membre Dernière intervention   2
 
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   Statut Membre Dernière intervention   2
 
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   Statut Membre Dernière intervention   2
 
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   Statut Membre Dernière intervention   894
 
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   Statut Membre Dernière intervention   2
 
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   Statut Membre Dernière intervention   894
 
comment est ton tableau ?
0
Elodie_79 Messages postés 73 Date d'inscription   Statut Membre Dernière intervention   2
 
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   Statut Membre Dernière intervention   894
 
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   Statut Membre Dernière intervention   2
 
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   Statut Membre Dernière intervention   228
 
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   Statut Membre Dernière intervention   894
 
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   Statut Membre Dernière intervention   2
 
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   Statut Membre Dernière intervention   894
 
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   Statut Membre Dernière intervention   13
 
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   Statut Membre Dernière intervention   2
 
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   Statut Membre Dernière intervention   13
 
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   Statut Membre Dernière intervention   2
 
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   Statut Membre Dernière intervention   13
 
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   Statut Membre Dernière intervention   2
 
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   Statut Membre Dernière intervention   894
 
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   Statut Membre Dernière intervention   2
 
Merci pour tes essais mais toujours ça marche pas
0
Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   894
 
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   Statut Membre Dernière intervention   2
 
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   Statut Membre Dernière intervention   894
 
a quoi correspondent ces compteurs $i $j ?
0
Elodie_79 Messages postés 73 Date d'inscription   Statut Membre Dernière intervention   2
 
car mon tableau là où je dois récupérer mes données est un tableau à deux dimensions
0