Page 1 sur 1

comparaison entre deux tableaux

Posté : 30 juil. 2007, 13:59
par béka
Bonjour tout le monde.
J'explique mon problème.

Je dispose de deux fichiers xml de matrice qui permette de faire le lien entre, pour l'un, des critères de recherches et des items et pour l'autre entre des critères (les mêmes) et des auteurs.

Mes deux fichiers xml on la même structure à savoir : (ceci est un exemple)

Code : Tout sélectionner

<root last_insert="2"> <link id="1"> <criteria idcat="1" idcrit="1"/> <criteria idcat="1" idcrit="2"/> <criteria idcat="3" idcrit="1"/> <criteria idcat="3" idcrit="2"/> <criteria idcat="3" idcrit="3"/> <criteria idcat="3" idcrit="4"/> <criteria idcat="3" idcrit="5"/> <criteria idcat="3" idcrit="6"/> <contributor id="1"/> </link> <link id="2"> <contributor id="2"/> </link> </root>
Mes critères sont définis par un fichiers xml et sont répartis dans des catégories.
Par exemple, ainsi :

Code : Tout sélectionner

<root> <cat id="1" name="New"> <criteria id="1" name="dessin" /> <criteria id="2" name="stade" /> </cat> <cat id="2" name="Chaine"> <criteria id="1" name="tf1 /> <criteria id="2" name="france2" /> </cat> </root>
Je voudrais alors créer deux tableaux : l'un (tableau 1) qui contient les couples de critère (catégorie et critère) propre aux auteurs et l'autre (tableau 2) propre aux item.

Ensuite, lorsque ces tableaux sont faits, je voudrais comparer les deux tableaux et si au moins un couple du tableau 2 est présent dans le tableau 1 alors ensuite je fais mon traitement (ici mon traitement sera l'affichage de l'item qui est dans les deux tableaux).

Je sais pas si je m'explique clairement mais voici déjà mon code.

Ceci ne doit pas etre correct je pense car lorsque je fais un print_r() de mon tableau final (practice), il m'affiche tous les id de tous les items.
<?
//on affiche uniquement les practices qui ont les mm critères que le membre du comité
$linkPract_file = '../'.$cfg['ressources_root'].'matrix/criteria-practice.xml';
$xmlPract = simplexml_load_file($linkPract_file);//on ouvre le fichier xml

$linkContr_file = '../'.$cfg['ressources_root'].'matrix/criteria-contributor.xml';
$xmlContr = simplexml_load_file($linkContr_file);//on ouvre le fichier xml


//on construit le tableau des couples cat/crit présents dans le fichier criteria-contributor.xml
foreach ($xmlContr->link as $value){
   //$contr = null; //tableau pour ordonner les critères par cat
   foreach($value->criteria as $criteria){     
     $idcat = $criteria['idcat'];
     $idcrit = $criteria['idcrit'];
     //construire le tableau de critères
     $contr[] = "$idcat/$idcrit";
   }
}
//echo "<pre>"; print_r($contr); echo "</pre>";
  
  
//on construit le tableau des couples cat/crit présents dans le fichier criteria-practice.xml
//$practice = null; //tableau pour ordonner les critères par cat
foreach($xmlPract->link as $value2)
{     
   $id_practice = $value2->practice['id'];
   //echo $id_practice;
   foreach($value2->criteria as $criteria2){    
     $idcat = $criteria2['idcat'];
     $idcrit = $criteria2['idcrit'];
     //construire le tableau de critères
     $pract[] = "$idcat/$idcrit";
   }
   //echo "practice-criteria :<pre>"; print_r($pract); echo "</pre>";
   //Rapprochement du tableau $cront et du tableau du $pract
    if (is_array($contr) && is_array($pract)) {
            //calculer l'intersection entre les critères
            $inter = array_intersect($pract, $contr); 
            //print_r($inter);
            //Si les critères $contr sont inclus dans $pract alors practice trouvé (différence vide)
            $diff = array_diff( $pract, $inter);
            //print_r($diff);
            //if ($diff == array()) {
            if (is_array($diff)) { 
              $practice[] = $id_practice;
            }
   }
}
echo "<pre>"; print_r($practice); echo "</pre>"; 
     
if ( (isset($practice) and count($practice) >0 )) // si le tableau $practice est rempli 
  {
//ici mon traitement
}
exit;
?>

Si quelqu'un peut m'aider...

Posté : 30 juil. 2007, 14:10
par Ryle
As-tu jeté un coup d'oeil à la doc sur les tableauxet à toutes les sympathiques fonctions qui existent pour jouer avec ?
- in_array()
- array_diff()
- array_intersect()
- ...

Posté : 30 juil. 2007, 14:14
par béka
je commence à être un habitué et à connaître les règles de ce forum... donc oui j'ai regardé, et je m'y perds lol (même si ce n'est pas drôle).
En fait le truc, c'est que je n'arrive pas à insérer dans le tableau final uniquement les id des items qui correpondent aux deux tableaux, ce m'insère tous les id de tous les items.
C'est là le bug je pense.

Posté : 30 juil. 2007, 14:24
par Ryle
Ben alors je ne comprends pas pourquoi tu calcules l'intersection si tu ne l'utilises pas ? Et encore moins pourquoi tu testes les valeurs différentes quand ce qui t'interesse c'est de savoir s'il y a des données communes ? :)

Nota : Par ailleurs if (is_array($diff)) sera toujours vrai, puisque le résultat de array_diff() est un tableau :)

Posté : 30 juil. 2007, 14:31
par béka
Ben je fais un array_intersect() pour avoir toutes les valeurs de $pract qui sont dans $contr ok ? ca ca me semble bon. A la limite d'ailleurs, juste ceci pourrait servir ?


EDIT :

En fait, j'ai abandonné cette idée de comparaison de tableau et ait utilisé plutot les requêtes xpath.
Donc c'est bon, j'arrive bien à ce que je veux : récupérer l'id d'un item.

Posté : 30 juil. 2007, 16:50
par Ryle
A la limite d'ailleurs, juste ceci pourrait servir ?
Ben voui d'où ma question pour savoir si tu avais lu la doc des fonctions vu que tu semblais un peu les mélanger... suffisait effectivement juste de faire l'intersection des deux tableaux et de compter si le tableau obtenu avait des éléments ou pas :)

Enfin si tu as opté pour une autre solution et que cela fonctionne, c'est le principal :)

Posté : 30 juil. 2007, 17:00
par béka
ben en fait j'utilise plus ou moins le système de compter si le tableau contient des éléments mais je le fait pas avec la fonction array_intersect().
Enfin oui, j'ai trouvé une solution.