[PHP] Algo : trouver les éléments pas commun à deux tableaux

Algo : trouver les éléments pas commun à deux tableaux [PHP] - PHP - Programmation

Marsh Posté le 23-10-2003 à 10:57:12    

Salut !
j'ai deux tableaux et j'aimerai isoler les éléments qui ne sont pas commun à ces 2 tableaux (élément présent dans l'un mais pas dans l'autre).
D'après vous c'est quoi le meilleur algo pour faire ca ?
Merci

Reply

Marsh Posté le 23-10-2003 à 10:57:12   

Reply

Marsh Posté le 23-10-2003 à 11:02:43    

arf array_diff()

Reply

Marsh Posté le 24-10-2003 à 12:34:47    

euh ! en fait je ne comprends pas trop le fonctionnement de array_diff() (voir ci dessous) donc si qqun avait un algo pour repérer les éléments qui ne sont pas aux 2 tableaux , ca m'interesse.
 
Voici ce que j'obtiens avec array_diff() : anomalie correspond à array_diff($fichier,$dossier) ET array_diff($dossier,$fichier)
: les sauts de lignes à la fin sont des éléments du tableau anomalie !  :heink:  
 


Fichiers :
BLUGEO-MDIJO
CLAUDO-MDIJO
CTRL-MDIJO
DIAS-MDIJO
MICHON-MDIJO
ROBINE-MDIJO
VBOUNIA
VCHARTI
VMICHON
 
Dossiers :
.
..
BLUGEO-MDIJO
CLAUDO-MDIJO
DIAS-MDIJO
MICHON-MDIJO
ROBINE-MDIJO
VBLUGEO
VBOUNIA
VCHARTI
VDIAS
VMICHON
VPAGESP
VROBINE
 
Anomalies :  
.
..
 
 
 
 
 
 
 

Reply

Marsh Posté le 24-10-2003 à 13:05:32    

Montre le bout de code qui fait çà.
Tu dois te prendre les pieds dans le tapis sur le 'ET'...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 24-10-2003 à 13:28:42    

Mara's dad a écrit :

Montre le bout de code qui fait çà.
Tu dois te prendre les pieds dans le tapis sur le 'ET'...


je ne pense pas mais bon :
 
 


$cmd="net use g: \\\\ctrl-mdijo\\ssa$";
exec($cmd);
 
$handle=opendir('g:\\donnees\\');
echo "Pointeur de dossier : $handle\n";
echo "Fichiers :\n";
while ($file = readdir($handle))
 {
if($file !='.' ||$file !='..'|| !(eregi('CTRL',$file)))
 {
 if(ereg('.ssa',$file))
  {
  $file=ereg_replace('.ssa','',$file);
  $fichier[]=$file;
  }
 else $dir[]=$file;  
 
 }
  }
  closedir($handle);
   
$cmd="net use g: /d /y";
exec($cmd);
 
echo "Fichiers :<br>";
for($i=0;$i<=sizeof($fichier);$i++)
{
echo "$fichier[$i]<br>";
}
 
echo "Dossierss :<br>";
for($i=0;$i<=sizeof($dir);$i++)
{
echo "$dir[$i]<br>";
}
 
 
$anomalie=array_diff($fichier,$dir);
$anomalie=array_diff($dir,$fichier);
Echo " Anomalies : <br>";
for($i=0;$i<=sizeof($anomalie);$i++)
{
if(ereg('CTRL',$anomalie[$i]))
{
}
else
{
echo "$anomalie[$i]<br>";
}}
?>


 
ps je suis en php 4.0.6 ... vais ptet faire une mise à jour qd meme  :whistle:  
 
 :hello:


Message édité par kayasax le 24-10-2003 à 13:50:36
Reply

Marsh Posté le 24-10-2003 à 14:57:07    

arf ! j'ai trouvé c'est mon affichage du tableau qui déconne, lorsque j'utilise print_r($anomalie) ca fonctionne... -> c'est du au fait que les index ne sont pas contigus ! et que sizeof() ne retourne pas l'index max :
 

Citation :

This is taken from sganer@expio.co.nz comments on the sizeof() function:  
If some elements in your array are not set, then sizeof() and count() will not return the index of the last element, but will return the number of set elements. To find the index of the last element in the array:  
end($yourArray);  
$index = key($yourArray);

from php.net fonction count()


Message édité par kayasax le 24-10-2003 à 15:07:48
Reply

Marsh Posté le 24-10-2003 à 15:15:15    

Ok, alors voilà :
 
Plusieurs problèmes
 
1- Pas grave, mais :/
On ne fait pas :

Code :
  1. if( condition )
  2. {
  3. }
  4. else
  5. {
  6.        instruction
  7. }


 
mais :

Code :
  1. if( ! condition )
  2. {
  3.        instruction
  4. }


 
2- Tu utilise le même tableau $anomalie, or la deuxième fois, il est écrasé.
 
3-  

Citation :

array_diff() retourne un tableau qui contient toutes les valeurs du tableau array1 qui sont absentes de tous les autres arguments. Notez que les clés sont préservées.


 
Ca veut dire que dans ta boucle de parcours de $anomalie, tu ne peut pas utiliser un indice $i incrémenté. Les indices sont ceux du premier tableau argument de array_diff.
 
 
Regarde ce que fait çà :

Code :
  1. <?php
  2. $fichier[0] = 'BLUGEO-MDIJO';
  3. $fichier[1] = 'CLAUDO-MDIJO';
  4. $fichier[2] = 'CTRL-MDIJO';
  5. $fichier[3] = 'DIAS-MDIJO';
  6. $fichier[4] = 'MICHON-MDIJO';
  7. $fichier[5] = 'ROBINE-MDIJO';
  8. $fichier[6] = 'VBOUNIA';
  9. $fichier[7] = 'VCHARTI';
  10. $fichier[8] = 'VMICHON';
  11. $dir[0] = '.';
  12. $dir[1] = '..';
  13. $dir[2] = 'BLUGEO-MDIJO';
  14. $dir[3] = 'CLAUDO-MDIJO';
  15. $dir[4] = 'DIAS-MDIJO';
  16. $dir[5] = 'MICHON-MDIJO';
  17. $dir[6] = 'ROBINE-MDIJO';
  18. $dir[7] = 'VBLUGEO';
  19. $dir[8] = 'VBOUNIA';
  20. $dir[9] = 'VCHARTI';
  21. $dir[10] = 'VDIAS';
  22. $dir[11] = 'VMICHON';
  23. $dir[12] = 'VPAGESP';
  24. $dir[13] = 'VROBINE';
  25. $anomalie_fic=array_diff($fichier,$dir);
  26. //$anomalie=array_diff($dir,$fichier);
  27. echo " Anomalies fic : <br><pre>";
  28. print_r( $anomalie_fic );
  29. echo "</pre>";
  30. foreach( $anomalie_fic as $ano)
  31. {
  32. if( ! ereg( 'CTRL', $ano ) )
  33. {
  34.  echo "$ano<br>";
  35. }
  36. }
  37. $anomalie_dir=array_diff($dir,$fichier);
  38. echo "<hr> Anomalies dir : <br><pre>";
  39. print_r( $anomalie_dir );
  40. echo "</pre>";
  41. foreach( $anomalie_dir as $ano)
  42. {
  43. if( ! ereg( 'CTRL', $ano ) )
  44. {
  45.  echo "$ano<br>";
  46. }
  47. }
  48. ?>


 
Le deuxième tableau contient 6 éléments ( dans ta version comme dans la mienne vu que dans la tienne, il est écrasé ) dont les indices sont 0, 1, 7, 10, 12 et 13.
Donc si $i va de 0 à 5 çà donne bien :
$anomalie[0] -> .
$anomalie[1] -> ..
$anomalie[2] ->  
$anomalie[3] ->  
$anomalie[4] ->  
$anomalie[5] ->  
 
Conclusion, utiliser print_r() pour voir la structure réelle d'un tableau quand on ne comprends pas ce qui se passe.
Bien mettre entre <pre> et </pre> car print_r génère des retour chariot et non pas des <br>.
 
 


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 24-10-2003 à 15:15:41    

Bon, ben grilled quoi !
 
end() et key(), c'est joli, mais je préfère foreach(), surtout si les indices ne sont pas numériques.


Message édité par Mara's dad le 24-10-2003 à 15:17:14

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 24-10-2003 à 15:36:19    

lol ! clair t'es grillé la !  
merci de t'etre penche la dessus tu as du vraiment bossé pour ca !!
sinon pour tes remarques :
1 - mouais ok
2 - OK
3 - c'est ce que j'avais dis .
 
MERCI MERCI pour le foreach($tab as $val) {} , ca déchire !!
 
Merci , a+


Message édité par kayasax le 24-10-2003 à 15:54:01
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed