Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jaka pętla?
Forum PHP.pl > Forum > Przedszkole
3miel
Witam,

mam taką funkcję:

php:
  1. <? 
  2. function losuj($tresc, $nrjezyk){ 
  3. srand((float) microtime() * 10000000); 
  4. global $slowko; 
  5. global $losowa_liczba; 
  6. global $slowkonr; 
  7. $losowa_liczba = array_rand ($tresc, 1); 
  8. $losowa_liczba+1; 
  9. $slowko0 = explode("|", $tresc[$losowa_liczba]); 
  10. $slowko = $slowko0[$nrjezyk]; 
  11. $slowkonr = $slowko0[3]; 
  12. } 
  13.  
  14. losuj($tresc, $_GET['nrjezyk']); 
  15. ?>


i teraz jeżeli wylosuje liczbe ($slowkonr=='1') to chce zrobić, żeby na nowo losowało (powtarzała się funkcja losuj).

Jak to zrobić?
s_w_ir
Rekurencja.
  1. <?php
  2. function losuj($tresc, $nrjezyk){ 
  3. srand((float) microtime() * 10000000); 
  4. global $slowko; 
  5. global $losowa_liczba; 
  6. global $slowkonr; 
  7. $losowa_liczba = array_rand ($tresc, 1); 
  8. $losowa_liczba+1; 
  9. $slowko0 = explode("|", $tresc[$losowa_liczba]); 
  10. $slowko = $slowko0[$nrjezyk]; 
  11. $slowkonr = $slowko0[3]; 
  12. if($slowkonr=='1') function($tresc, $nrjezyk);
  13. }
  14. losuj($tresc, $_GET['nrjezyk']); 
  15. ?>
Nie gwarantuje ze sie nie zapetli ale przeanalizuj to sobie.
3miel
Parse error: parse error, unexpected T_FUNCTION in /home/3/m/i/3miel/www/english/index.php on line 128

chyba jednak to nie zadziała sad.gif

Macie inne pomysły?
sendi16
  1. <?
  2. function losuj($tresc, $nrjezyk){
  3. srand((float) microtime() * 10000000);
  4. global $slowko;
  5. global $losowa_liczba;
  6. global $slowkonr;
  7. $losowa_liczba = array_rand ($tresc, 1);
  8. $losowa_liczba+1;
  9. $slowko0 = explode("|", $tresc[$losowa_liczba]);
  10. $slowko = $slowko0[$nrjezyk];
  11. $slowkonr = $slowko0[3];
  12.  
  13. return $slowkonr;
  14. }
  15.  
  16. $slowkonr = 1;
  17.  
  18. while($slowkonr == 1)
  19. {
  20. $slowkonr = losuj($tresc, $_GET['nrjezyk']);
  21. }
  22. ?>


sprobuj tego
s_w_ir
Cytat(3miel @ 2005-09-30 21:53:52)
Parse error: parse error, unexpected T_FUNCTION in /home/3/m/i/3miel/www/english/index.php on line 128

chyba jednak to nie zadziała sad.gif

Znowu sie walnołem w kodzie. Nie spodziewałem sie że nie znasz działania rekurencji, i nawet nie przeanalizowałeś kodu. Zamiast function powinno byc losuj:
  1. <?php
  2. function losuj($tresc, $nrjezyk){ 
  3. srand((float) microtime() * 10000000); 
  4. global $slowko; 
  5. global $losowa_liczba; 
  6. global $slowkonr; 
  7. $losowa_liczba = array_rand ($tresc, 1); 
  8. $losowa_liczba+1; 
  9. $slowko0 = explode("|", $tresc[$losowa_liczba]); 
  10. $slowko = $slowko0[$nrjezyk]; 
  11. $slowkonr = $slowko0[3]; 
  12. if($slowkonr=='1') losuj($tresc, $nrjezyk);
  13. ?>
blink.gif
3miel
Pierwszy raz spotkałem się z rekurencją, a kod analizowałem, ale jak nie znam sie na tym zagadanieniu to skąd mogłem wiedzieć smile.gif

Ale teraz mam inny problem (i nawet nie moge sprawdzić czy ten spsoó działa), ponieważ mam cos takeigo:

  1. <?
  2.     for($i=0  ;  $i<$ile  ;  $i++){
  3.         echo $tresc[$i].'<br>';
  4.     }
  5.     echo '<br><br>';
  6.  
  7.     function losuj($tresc, $nrjezyk){
  8.         global $slowko;
  9.         global $losowa_liczba;
  10.         global $slowkonr;
  11.         $losowa_liczba = array_rand ($tresc, 1);
  12.         $losowa_liczba+1;
  13.         $slowko0 = explode("|", $tresc[$losowa_liczba]);
  14.         $slowko = $slowko0[$nrjezyk];
  15.         $slowkonr = $slowko0[3];    
  16.         if($slowkonr == 1) losuj($tresc, $nrjezyk);
  17.     }
  18.  
  19.     losuj($tresc, $_GET['nrjezyk']);
  20.  
  21.     echo 'L. losowa:'.$losowa_liczba.'<br />
  22.     Slowo nr: '.$slowkonr.'<br /><br />';
  23. ?>


i wyświetla się coś takiego:

Kod
1|lesson|lekcja|0
2|topic|temat|0
3|know|wiedzieć|0
4|happy|szczęsliwy|0
5|holiday|wakacje|0
6|phone|telefon|0
7|english|angielski|0


L. losowa:12
Slowo nr: 0


Jakim cudem losuje liczbe 12, jezeli jest tylko 7 wersów (słówek)?
s_w_ir
  1. <?php
  2.  function losuj($tresc, $nrjezyk){
  3. global $slowko;
  4. global $losowa_liczba;
  5. global $slowkonr;
  6. $losowa_liczba = array_rand ($tresc, 1); //tresc= tablica, wybieramy 1 element z 7
  7. $losowa_liczba+1; //moze byc rowne od 1 do 7
  8. $slowko0 = explode("|", $tresc[$losowa_liczba]); // tablica 4 elementowa o max indeksie = 3
  9. $slowko = $slowko0[$nrjezyk];//rozumiem ze nrjezyk 1 lub 2
  10. $slowkonr = $slowko0[3]; //slowkonr moze byc tylko rowne 0 jak wynika z tablicy ktora podales
  11. if($slowkonr == 1) losuj($tresc, $nrjezyk);
  12. }
  13. ?>
Powiedz mi czy dobrze to okomentowałem, bo jeśli tak to 'if'
  1. <?php
  2. if($slowkonr == 1) losuj($tresc, $nrjezyk);
  3. ?>
nigdy nie bedzie mial wartości true
3miel
dobrze, ta rekurencja ma zachodzic tylko w tedy gdy bedzie jeden, bo jak ja stopniowo bede zgadywał słwoka, to ostatnia cyfra ma sie zmeinic na 1, i nie moze byc tak zeby słowko sie powtarzało wiec bedzie rekurencja.

Ale dlaczeog ta liczba jest taka wysoka? (losowa)
s_w_ir
Dwie sprawy:
sprawdź czy wcześniej w skrypcie nie masz użytej zmiennej
  1. <?php
  2. $losowa_liczba 
  3. ?>

Po drugie wstaw w kod funkcji funkcje echo aby sprawdzac co sie dzieje:
  1. <?php
  2.  
  3. echo("Przed przypisaniem: " . $losowa_liczba);
  4. $losowa_liczba = array_rand ($tresc, 1);
  5. echo("Po przypisaniem: " . $losowa_liczba);
  6. $losowa_liczba+1;
  7. echo("Po inkrementacji: " . $losowa_liczba);
  8.  
  9. ?>
3miel
nie ma bo jak dam: echo 'przed przypisaniem: '.$losowa_liczba.'<br />';to nic sie nei wyswietla, a pozatym w argumentach funkcji nie jest przekazywana wartość losowej liczby.

a wyswietla sie cos takiego:

Kod
przed przypisaniem:
po przypisaniem: 12
po inkrementracji: 12
L. losowa:12


Dziwna sprawa. A tak na marginesie to w jaki sposó wylosowac l. całkowitą z zakresu od 1 do $ile?
s_w_ir
rand()
A co do sprawy, to zawsze Ci zwraca 12? Bo u mnie zmontowałem cos podobnego i zwraca mi rózne liczby. Druga sprawa spójrz na to:
  1. <?php
  2. $losowa_liczba = array_rand ($tresc, 1);
  3. $losowa_liczba+1;// to kompletnie nic nie robi, nie zmienia wartosci zmiennej
  4.  
  5. ?>

Daj mi tablice na której operujesz to może coś sie wymyśli.
3miel
Nie zawsze sie wyswietla 12, lecz losowe liczby, które czasmi sa wieksze od liczby rekordów w tablicy (7).

tablica to tak jak juz wspomniałem:
Kod
1|lesson|lekcja|0
2|topic|temat|0
3|know|wiedzieć|0
4|happy|szczęsliwy|0
5|holiday|wakacje|0
6|phone|telefon|0
7|english|angielski|0


i odczytuje to z pliku poprzez:

  1. <?
  2.     $filename='lekcje/'.$katalog.'/'.$plik.'.txt';
  3.     $file = file($filename); 
  4.     for( $i=0  ;  $i<count($file)  ;  $i++){
  5.         $tresc[] = chop($file[$i]);
  6.     }
  7. ?>


----------EDIT----------
Jaki głupi błąd tongue.gif,

miałem w kodzie 2 razy tworzoną tablicę $tresc[] smile.gif Już jest wszystko w pożądku.
s_w_ir
  1. <?php
  2. $tresc=array("1|lesson|lekcja|0",
  3. "2|topic|temat|0",
  4. "3|know|wiedzieć|0",
  5. "4|happy|szczęsliwy|0",
  6. "5|holiday|wakacje|0",
  7. "6|phone|telefon|0",
  8. "7|english|angielski|0");
  9.  
  10. function losuj($tresc, $nrjezyk){
  11. global $slowko;
  12. global $losowa_liczba;
  13. global $slowkonr;
  14. $losowa_liczba = array_rand ($tresc, 1);
  15. $slowko0 = explode("|", $tresc[$losowa_liczba]);
  16. $slowko = $slowko0[$nrjezyk];
  17. $slowkonr = $slowko0[3];
  18. $losowa_liczba++; //inkrementacja przenisioan na koniec żebybyły dostępne liczby od 1 do 7
  19. if($slowkonr == 1) losuj($tresc, $nrjezyk);
  20. }
  21. losuj($tresc, 2);
  22.  
  23. echo 'L. losowa:'.$losowa_liczba.'<br />
  24. Slowo nr: '.$slowkonr.'<br /><br />';
  25. echo $slowko; //wyświetlenie wyrazu
  26.  
  27. ?>


Nie da rady żeby wyświetliło inne liczby niż od 1 do 7. Podejżewam że chodzi o plik, pewnie masz tam dodatkowe puste wiersze. Dodaj do swojego skryptu wyświetlenie wyrazu i zobacz czy jak masz większą liczbe niz przewidziana to czy masz jakiś wyraz.

Potem spróbuj zmodyfikować pętle:
  1. <?
  2. $filename='lekcje/'.$katalog.'/'.$plik.'.txt';
  3. $file = file($filename); 
  4. for( $i=0 ; $i<count($file) ; $i++){
  5. if($file[$i] == "" OR $file[$i]==" ") continue; 
  6. $tresc[] = chop($file[$i]);
  7. }
  8. ?>
3miel
Już gra, odpowiedz w poscie wyżej smile.gif.

Ale mam jeszcze jeden problem, otórz jak zgadne słowo i pisze Dobrze smile.gif to czasmi znowu losuje ten sam wyraz, tak jakby stronka albo skrypt chashowało tablice $tresc[], jak to naprawić? Czy nalerzy usunac tablice i na nowa ją stworzyć?

cały skrypt:
  1. <?
  2.     //--- WRZUCENIE PLIKU DO TABLICY ---
  3.     $filename='lekcje/'.$katalog.'/'.$plik.'.txt';
  4.     $file = file($filename); 
  5.     for( $i=0  ;  $i<(count($file)-2)  ;  $i++){
  6.         $tresc[] = chop($file[$i+2]);
  7.     }
  8.     $ile=count($tresc);
  9.  
  10.     //--- PRZGOTOWANIE PLIKU DO TESTU ---
  11.     if($_GET['akcja2'] == 'poczatek'){
  12.         for($i=0  ;  $i<$ile  ;  $i++){
  13.             $filename='lekcje/'.$katalog.'/'.$plik.'.txt';
  14.             $file = file($filename); 
  15.             $co = explode("|", $tresc[$i]);
  16.             $nowy = $co[0].'|'.$co[1].'|'.$co[2].'|0'; 
  17.             $file[$i+2] = $nowy."rn";
  18.             $file = implode("",$file); 
  19.             $fp = fopen($filename , "w");flock($fp,2); 
  20.             fputs( $fp , $file); 
  21.             flock($fp,3);fclose($fp); 
  22.         }
  23.     }
  24.     //--- TYTUŁ ---
  25.     $filename='lekcje/'.$katalog.'/'.$plik.'.txt';
  26.     $file = file($filename); 
  27.     $title = chop($file[0]); 
  28.     echo '<span class="title">'.$title.'</span>';
  29.  
  30.     //--- USTALENIE JEZYKA (EN->PL, PL->EN) ---    
  31.     if($_GET['jezyk'] == 'English -> Polski'){ $_GET['nrjezyk'] = 1; $_GET['nrjezyk2'] = 2;}
  32.     elseif($_GET['jezyk'] == 'Polski -> English'){ $_GET['nrjezyk'] = 2; $_GET['nrjezyk2'] = 1;}
  33.  
  34.     //--- FORMULARZ I HIDDEN ---
  35.     echo '
  36.     <form method="get" action="index.php">
  37.     <input type="hidden" name="katalog" value="'.$katalog.'" />
  38.     <input type="hidden" name="plik" value="'.$plik.'" />
  39.     <input type="hidden" name="akcja" value="dyktando" />
  40.     <input type="hidden" name="nrjezyk" value="'.$_GET['nrjezyk'].'" />
  41.     <input type="hidden" name="nrjezyk2" value="'.$_GET['nrjezyk2'].'" />
  42.     ';
  43.  
  44.  
  45.  
  46.     $slowko2 = explode("|", $tresc[$_GET['nr']]);
  47.     $slowko2 = $slowko2[$_GET['nrjezyk2']];
  48.     if($_GET['akcja2'] != 'poczatek'){
  49.     if($_GET['slowko2'] == $slowko2){
  50.         echo '<font color="green">Dobrze! :)</font><input type="hidden" name="bledne" value="'.$_GET['bledne'].'" /><input type="hidden" name="poprawne" value="'.++$_GET['poprawne'].'" /><br /><br /><br />';
  51.         $filename='lekcje/'.$katalog.'/'.$plik.'.txt';
  52.         $file = file($filename); 
  53.         $co = explode("|", $tresc[$_GET['nr']]);
  54.         $nowy = $co[0].'|'.$co[1].'|'.$co[2].'|1'; 
  55.         $file[$_GET['nr']+2] = $nowy."rn";
  56.         $file = implode("",$file); 
  57.         $fp = fopen($filename , "w");flock($fp,2); 
  58.         fputs( $fp , $file); 
  59.         flock($fp,3);fclose($fp); 
  60.  
  61.     }else{
  62.         echo '<font color="red">Zle! :(</font><input type="hidden" name="bledne" value="'.++$_GET['bledne'].'" /><input type="hidden" name="poprawne" value="'.$_GET['poprawne'].'" /><br /><br /><br />';
  63.     }
  64.     }
  65.     echo 'Pytanie ['.$_GET['poprawne'].'/'.$ile.'] [Poprawne: '.$_GET['poprawne'].' Błędne: '.$_GET['bledne'].']<br />
  66.     <br /><br />';
  67.  
  68.     if($_GET['poprawne'] != $ile){
  69.  
  70.     function losuj($tresc, $nrjezyk){
  71.         srand((float) microtime() * 10000000); 
  72.         global $slowko;
  73.         global $losowa_liczba;
  74.         global $slowkonr;
  75.      [b]   $losowa_liczba = array_rand ($tresc, 1);[/b] //PRZEZ TEN WERS SIE WIESZA
  76.         $slowko0 = explode("|", $tresc[$losowa_liczba]);
  77.         $slowko = $slowko0[$nrjezyk];
  78.         $slowkonr = $slowko0[3];    
  79.         if($slowkonr == 1) losuj($tresc, $nrjezyk);
  80.     }
  81.  
  82.     losuj($tresc, $_GET['nrjezyk']);
  83.  
  84.     echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<big><b>'.$slowko.'</b><big><br><br>
  85.     <input type="text" name="slowko2"><br><br>
  86.     <input type="hidden" name="nr" value="'.$losowa_liczba.'">
  87.     <input type="hidden" name="slowko" value="'.$slowko.'">
  88.     <input type="submit" value="Dalej">';
  89.  
  90.     }else{
  91.         echo 'Koniec testu!';
  92.     }
  93. ?>


Aha, nie iwem czememu ale cos znowu nei działa: http://3miel.ovh.org/english/index.php?kat...ish+-%3E+Polski spróbujcie czy jak dobrze odpowiecie, czy mozna dalej odpowiadac, bo u mnei sie wiesza :/

-EDIT--------
doszedłem do wniosku, że skrypt sie wiesza przy losowaniu liczby losowej.
Co moze byc przyczyną?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.