Comparer un tableau avec plusieurs autres (tableaux)
Elodie_79 Messages postés 75 Statut Membre -
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
- Comparer un tableau avec plusieurs autres (tableaux)
- Tableau word - Guide
- Trier un tableau excel - Guide
- Imprimer un tableau excel - Guide
- Tableau croisé dynamique - Guide
- Tableau des codes ascii - Guide
17 réponses
Problème : après la création d’un tableau à deux dimensions, il s’agit de comparer les éléments afin d’éliminer ceux qui apparaissent plusieurs fois, en explorant notamment l’usage de array_intersect pour vérifier les doublons entre les sous-tableaux. Des réponses proposent d’identifier les doublons en comparant les contenus des sous-tableaux et suggèrent que l’approche doit peut-être être adaptée pour créer plusieurs tableaux distincts plutôt qu’un seul à deux dimensions. Pour que le résultat soit exploitable, certains rappellent d’exposer le problème avec un exemple clair, notamment sur ce qui constitue une clé d’unicité et sur la manière d’utiliser array_intersect ou des méthodes alternatives. D’autres précisent que la suppression des doublons peut nécessiter de préciser l’origine des données et de localiser les correspondances exactes, afin de réduire la taille du tableau sans introduire d’erreurs.
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.
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!!!
array(
[0]=>array(
[0]=>alain
[1]=>natalie
.
.
.
)
[1]=>array(
[0]=>alain
[1]=>pomme
[2]=>banane
.
.
.
)
.
.
.
)
$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 questionj'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>';
$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
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 :(
<?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>';
:(
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
$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
$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é
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];
}
}
}
}
}
}
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)
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é
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 ?
--
:(){ :|:& };:
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 !!
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
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.
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