[PHP] Une boucle interne qui ne s'execute qu'une seule fois... :(

Une boucle interne qui ne s'execute qu'une seule fois... :( [PHP] - PHP - Programmation

Marsh Posté le 08-10-2002 à 15:58:53    

Je vous explique mon pb :
 
J'ai deux tableaux, un corpus (ensemble de texte) et un thésaurus (un dico).
J'ai des phrases dans les deux, et j'aimerai savoir quelles sont les phrases qu'on retrouve dans les deux, quelque soit l'ordre des mots.
 
Pour que ca aille plus vite (le corpus fait 56.000 lignes et le thésaurus 27.000), j'ai mis le thésaurus dans des tableaux differents en fonction du nb d'espaces (et donc, du nb de mots).
 
J'ai donc en gros une grosse boucle, qui parcours le corpus, à l'interieure de laquelle, une boucle parcours le thésaurus.
 
Et ké passa :
Je commence la grosse boucle :
je prend donc la première ligne du corpus, fait un implode selon les espaces.
Si il n'y a pas d'espaces, un simple in_array suffit, ca, ca marche.
Je continue sur ma boucle interne :
Si il y a un seul espace, je prend ma ligne du thesaurus, la coupe, et regarde si les deux morceaux sont identiques. Si c'est le cas, y'a bon. Sinon, je parcours mon thésaurus.
fin de la boucle interne. On reprend au debut
 
Si il n'a rien trouvé, il passe à la ligne suivante.
Redebut de la boucle interne
Or, il prend bien la ligne suivante du corpus, mais ne fait pas la boucle interne ... :(
 
J'ai mis un compteur pour vérifier, il ne veux passer qu'une fois par la boucle interne... :cry::cry:
 
Pourquoi ??
Y'a une limitation en php ??
en perl, ca marcherait mieux ??
Qqn aurait il une soluce toute faite en expression regulière qui tient en une ligne ?? :cry::cry:
Merci beaucoup.
 
Ps : le code joint en annexes :

Code :
  1. while (list($key_c, $val_c) = each($corpus)) {  // on prend les expressions du corpus les unes apres les autres...
  2. $morceaux_c = explode (' ',$val_c); // on explose la ligne en morceaux_corpus  
  3. $j++;
  4. echo "<br>$j : $val_c, ";  // affichage de la ligne du corpus.
  5. $comptage = substr_count($val_c, " " );
  6. if ( $comptage == 0 ) {  // si il y a 0 espace
  7. echo substr_count($val_c, " " ) . " espace";
  8.  if (in_array($val_c,$mesh_0)) echo " <b>identiques $val_c</b>";
  9.  echo array_search ($val_c,$thesaurus_0); // ca, ca marche impec.
  10. }
  11.  
  12.      
  13. if ( $comptage == 1 ) {  // si il y a 1 espaces
  14. echo substr_count($val_c, " " ) . " espace";
  15.  while (list($key_t, $val_t)=each($thesaurus_1)) {  // on prend une ligne du thesaurus correspondant au nb de ligne
  16.  $k++;
  17.  $morceaux_t = explode (' ',$val_t);
  18.  $comparaison = array_intersect ($morceaux_c, $morceaux_t); // on compare si les tableaux sont identiques.
  19.  
  20.   if (sizeof($comparaison) == sizeof($morceaux_c)) {
  21.    $corel_mesh++;  // si ca correspond, on le note.
  22.   }
  23.  }
  24. }
  25. echo ", et on a fait $k comparaisons"; // le $k n'est incrémenté qu'une seule fois, lors du premier passage. Apres, il s'en fout ... :(
  26. $k=0;
  27. }


 
Donc, en gros, pour ceux qui ont le flemme, le deuxième

Code :
  1. while

ne s'execute qu'au premier passage... :(


Message édité par TetardKing le 08-10-2002 à 16:16:32
Reply

Marsh Posté le 08-10-2002 à 15:58:53   

Reply

Marsh Posté le 08-10-2002 à 18:07:20    

J'ai effectivement la flemme
C'est normal les = a la place des == dans les conditions des while?

Reply

Marsh Posté le 08-10-2002 à 18:30:55    

Je vais essayer, mais dans la mesure où ca marche...
 
:jap:

Reply

Marsh Posté le 08-10-2002 à 19:11:34    

les = c'est normal avec un list() ou un each()
 
 
t'as esasyer de remplacer ton if ($comptage==1) par un else { ?
 
si ton comptage est différente de 0 ou 1 ta seconde boucle ne se fait pas..


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 09-10-2002 à 09:55:34    

Quelqu'un du forum seti à trouvé ce qui marchait pas.
 
En fait, avant de faire le deuxième while, faut faire un reset($thesaurus_1), pour remettre le pointeur au debut....  [:toad666]  
 
 
Un grand merci à tous ceux qui on bien vouluy jetter un coup d'oeil, et en esperant que ca puisse servir à qqn d'autre.
 
:jap:

Reply

Marsh Posté le 09-10-2002 à 10:12:11    

TetardKing a écrit a écrit :

Quelqu'un du forum seti à trouvé ce qui marchait pas.
 
En fait, avant de faire le deuxième while, faut faire un reset($thesaurus_1), pour remettre le pointeur au debut....  [:toad666]  
 
 
Un grand merci à tous ceux qui on bien vouluy jetter un coup d'oeil, et en esperant que ca puisse servir à qqn d'autre.
 
:jap:



Comment tu fais ce reset là?
Tu suprimes et recré la variable ou il y a une fonction prévus pour?

Reply

Marsh Posté le 09-10-2002 à 10:40:35    

tu fait un reset($thesaurus_1) juste avant le while :
 

Code :
  1. if ( $comptage == 1 ) {  // si il y a 1 espaces  
  2. echo substr_count($val_c, " " ) . " espace";
  3. reset($thesaurus_1);
  4. while (list($key_t, $val_t)=each($thesaurus_1)) {  // on prend une ligne du thesaurus correspondant au nb de ligne  
  5. $k++;
  6. $morceaux_t = explode (' ',$val_t);


 
et là, ca marche ...  :ouch:


---------------
Da Breizh WoRlD DoMIna7iOn T3aM * Baptiste Mary blog
Reply

Marsh Posté le 09-10-2002 à 11:02:37    

petit conseil d'optimisation
 
les parcours de tableau de type foreach() sont bien plus rapide que whille .. list .. each


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 09-10-2002 à 11:08:15    

Sh@rdar a écrit a écrit :

petit conseil d'optimisation
 
les parcours de tableau de type foreach() sont bien plus rapide que whille .. list .. each



Mieux vaut être en php4 pour utiliser foreach(). ;)
Par contre, je sais pas si son code était prévus pour du php3 ou du php4.

Reply

Marsh Posté le 09-10-2002 à 11:32:18    

J'ai php 4.2.0 et il était prevu pour.
 
Bon, tres bien, je me met à foreach alors. Vu la tonne de truc à traiter, ca sera pas du luxe :jap:
 
foreach ($thesaurus_1 as $val_t) { ...
 
Haaaaa, ces débutants, je vous jure ... :sarcastic:


Message édité par TetardKing le 09-10-2002 à 11:35:18

---------------
Da Breizh WoRlD DoMIna7iOn T3aM * Baptiste Mary blog
Reply

Sujets relatifs:

Leave a Replay

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