Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pętla while()
Forum PHP.pl > Forum > Przedszkole
swiru_
Witam,

Chce podzielic zdanie na dwie linijki, zalozmy ze jedna litera to 13px, maksymalna dlugosc to 590px, zdanie zlozone z 12 wyrazow lacznie zajmuje szerokosc 940px.

Trzy petle: petla1 -> wykona sie tyle razy ile razy zostanie podzielone zdanie 940px / 590px = 2,
pętla2 -> wykona sie tyle razy ile jest slow 12
pętla3 -> wykona sie dopoki laczna suma pikseli nie bedzie wieksza od 590, jezeli suma jest wieksza, zatrzymaj petle, wykonaj petle2 jeszcze raz i kontynuuj petle3 od zatrzymanego wyrazu...

No to tyle jesli chodzi o opis ;]

Wyklepalem cos takiego:

  1. <?php
  2.  
  3. $text = 'Kilka słów w zdaniu które muszą pixelowo zajmować więcej niż określone maxpx';
  4. $znakow = strlen($text);
  5.  
  6. $zdanie = explode(' ', $text);
  7. $slowa = array();
  8.  
  9. foreach ($zdanie as $str)
  10. {
  11. $slowo = preg_replace('#[^a-zęóąśłżźćń]+#i', '', $str);
  12. if(mb_strlen($slowo) > 0)
  13. {
  14. $slowa[] = $slowo;
  15. }
  16. }
  17.  
  18. $wyrazow = count($slowa);
  19. $px = 0;
  20. $litera = 13;
  21. $nr_slowa = 0;
  22. while($nr_slowa < $wyrazow) // potrzebne do wyliczenia ilosci linijek
  23. {
  24. $px = (strlen($slowa[$nr_slowa]) * $litera) + $px;
  25. $nr_slowa++;
  26. }
  27.  
  28.  
  29. $maxpx = 590;
  30. $ilosc_linijek = ceil($px / $maxpx);
  31. $i = 0;
  32. while ($i < $ilosc_linijek) //w tym przypadku wykona sie dwa razy
  33. {
  34. $wyrazow = count($slowa);
  35. $nr_slowa = 0;
  36. $litera = 13;
  37. $px = 0;
  38. while($nr_slowa < $wyrazow)
  39. {
  40. echo '</br>';
  41. $px = 0;
  42. do
  43. {
  44. echo ''.$slowa[$nr_slowa].' ';
  45. $px = (strlen($slowa[$nr_slowa]) * $litera) + $px;
  46. $nr_slowa++;
  47. }
  48. while($px < $maxpx);
  49. }
  50. $i++;
  51. }
  52.  
  53. ?>


Teoretycznie dziala, ale po wykonaniu wywali mi blad:

Fatal error: Maximum execution time of 30 seconds exceeded in (...) on line 48

I nie mam pojecia dla czego ;]
nospor
Się petla nie konczy to przekraczasz czas wykonywania skryptu.

Teoretycznie ta podwójna pętla:
while($nr_slowa < $wyrazow)
{
echo '</br>';
$px = 0;
do
{
echo ''.$slowa[$nr_slowa].' ';
$px = (strlen($slowa[$nr_slowa]) * $litera) + $px;
$nr_slowa++;
}
while($px < $maxpx);
}

może się nigdy nie skonczyć. Masz warunek:
while($nr_slowa < $wyrazow)
a $nr_slowa zwiekszasz dopiero w tej wewnętrznej pętli. Może się okazać, że do wewnętrznej pętli już nie będzie wchodził, wówczas $nr_slowa się nie będzie zwiększać i ciągle będzie się kręcił w pętli na warunku $nr_slowa < $wyrazow
swiru_
Twoje rozwiazanie tez wywala przekroczony czas...

ok wykminilem ;p

problem polega na tym ze dodanie kolejnego numeru do $nr_slowa nie moze odbyc sie wczesniej niz w koncowej petli bo program musi wiedziec na ktorym slowie zakonczyl ostatnia petle... rozwiazalem to dodajac w ostatniej petli if i exit()

  1. $maxpx = 590;
  2. $ilosc_linijek = ceil($px / $maxpx);
  3. $i = 0;
  4. $nr_slowa = 0;
  5. while($nr_slowa < $wyrazow)
  6. {
  7. echo '</br>';
  8. $px = 0;
  9. do
  10. {
  11. echo ''.$slowa[$nr_slowa].' ';
  12. $px = (strlen($slowa[$nr_slowa]) * $litera) + $px;
  13. if($nr_slowa === $wyrazow)
  14. {
  15. exit();
  16. }
  17. $nr_slowa++;
  18. }
  19. while($px < $maxpx);
  20. }


dzieki bardzo za pomoc, do zamkniecia smile.gif
lDoran


serwer musi mieć włączoną tę funkcję
nospor
Cytat
Twoje rozwiazanie tez wywala przekroczony czas...
Jakie moje rozwiązanie? Ja ci nie podawałem żadnego rozwiązania. Ja ci podałem gdzie robisz błąd.

@lDoran yyyy.....? Pętla się zapętla a ty jako tego rozwiązanie dajesz zwiększenie czasu wykonywania skryptu? Po Twoim rozwiązaniu skrypt się wywali po godzinie zamiast po 30 sekundach. Toć lepiej czekać 30 sekund niż godzinę na stwierdzenie, że pętla się zapetla.
swiru_
Cytat(nospor @ 9.06.2011, 07:26:18 ) *
Jakie moje rozwiązanie? Ja ci nie podawałem żadnego rozwiązania. Ja ci podałem gdzie robisz błąd.


o'rajt... jest 7:26 rano , nie spalem cala noc... ;] w takim razie twoja podpowiedz nakierowala mnie na rozwiazanie ;] dzieki

kurcze to rozwiazanie tez nie jest dobre, przeciez przez exit() po wykonaniu petli nie moge juz nic dalej robic w skrypcie ;/ czy jest jakis inny sposob zeby wymusic zatrzymanie petli??
nospor
Cytat
kurcze to rozwiazanie tez nie jest dobre, przeciez przez exit() po wykonaniu petli nie moge juz nic dalej robic w skrypcie
Właśnie zastanawiałem się kiedy na to wpadniesz wink.gif

break konczy pętle. Ale ty musisz też zakonczyc pętle nadrzędną. Musisz więc w petli nadrzędnej dać warunek, że jesli jakaś zmienna jest ustawiona to wtedy konczysz pętle nadrzędną. Wówczas w petli podrzędnej ustawiasz te zmienną i zaraz potem robisz break - będzie śmigać aż miło smile.gif
swiru_
Cytat(nospor @ 9.06.2011, 07:36:56 ) *
Właśnie zastanawiałem się kiedy na to wpadniesz wink.gif


hehe smile.gif dzieki raz jeszcze ;]
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.