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 -
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
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:
- Comparer un tableau avec plusieurs autres (tableaux)
- Tableau word - Guide
- Tableau ascii - Guide
- Trier un tableau excel - Guide
- Tableau croisé dynamique - Guide
- Imprimer un tableau excel - Guide
17 réponses
Salut,
apparemment c'est pas trés correct, ça devrait plutôt être comme ça !
Ou encore mieux comme ça ...
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.
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.
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!!!
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!!!
"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
.
.
.
)
.
.
.
)
array(
[0]=>array(
[0]=>alain
[1]=>natalie
.
.
.
)
[1]=>array(
[0]=>alain
[1]=>pomme
[2]=>banane
.
.
.
)
.
.
.
)
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);
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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)
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>';
as tu modifié ton array ?
si tu fais un essai avec le script tel que je t'ai donné ça marche.
si tu fais un essai avec le script tel que je t'ai donné ça marche.
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
$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
tu n'as rie du tout ? même pas d'erreur
même pas array()
même pas array()
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 :(
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 :(
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>';
chez moi aussi ça fonctionne tel qu'il est mais dés que je l'applique sur mon tableau ça ne fonctionne plus!!!
:(
:(
comment est ton tableau ?
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
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
impossible a traiter ton array, il n'est pas homogène
certains index ont deux dimensions, d'autres 3 d'autres une
$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
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é
$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é
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]; } } } } } }
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)
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)
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é
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é
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 ?
--
:(){ :|:& };:
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 ?
--
:(){ :|:& };:
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 !!
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 !!
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
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
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.
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.
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]; } } } } } }
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