Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Pętla while(), czas przekroczony
swiru_
post
Post #1





Grupa: Zarejestrowani
Postów: 63
Pomógł: 0
Dołączył: 1.10.2009

Ostrzeżenie: (0%)
-----


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 ;]
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
swiru_
post
Post #3





Grupa: Zarejestrowani
Postów: 63
Pomógł: 0
Dołączył: 1.10.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
lDoran
post
Post #4





Grupa: Zarejestrowani
Postów: 172
Pomógł: 13
Dołączył: 15.11.2009

Ostrzeżenie: (0%)
-----




serwer musi mieć włączoną tę funkcję
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
swiru_
post
Post #6





Grupa: Zarejestrowani
Postów: 63
Pomógł: 0
Dołączył: 1.10.2009

Ostrzeżenie: (0%)
-----


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??
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
swiru_
post
Post #8





Grupa: Zarejestrowani
Postów: 63
Pomógł: 0
Dołączył: 1.10.2009

Ostrzeżenie: (0%)
-----


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 ;]
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 06:58