Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [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
 
Start new topic
Odpowiedzi
swiru_
post
Post #2





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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 12.10.2025 - 12:12