Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Nieoptymalna pętla (zabija skrypt), jak inaczej?
in5ane
post 21.11.2013, 19:35:42
Post #1





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


Cześć. Mam problem z pętlami, które przy dużej ilości danych zabijają skrypt. Może znajdziecie lepszy pomysł na rozwiązanie mojego problemu. Na tą chwilę mam coś takiego:
  1. <?php
  2. $tab = array(
  3. 0 => array('ilosc' => 1, 'nazwa' => 'jedynka 1'),
  4. 1 => array('ilosc' => 2, 'nazwa' => 'dwojka 1'),
  5. 2 => array('ilosc' => 3, 'nazwa' => 'trojka 1'),
  6. 3 => array('ilosc' => 2, 'nazwa' => 'dwojka 2'),
  7. 4 => array('ilosc' => 2, 'nazwa' => 'dwojka 3'),
  8. 5 => array('ilosc' => 1, 'nazwa' => 'jedynka 2'),
  9. 6 => array('ilosc' => 1, 'nazwa' => 'jedynka 3'),
  10. 7 => array('ilosc' => 3, 'nazwa' => 'trojka 2'),
  11. 8 => array('ilosc' => 2, 'nazwa' => 'dwojka 4'),
  12. 9 => array('ilosc' => 1, 'nazwa' => 'jedynka 4')
  13. );
  14.  
  15. $ilosc = array(0 => 1, 1, 2, 2, 3);
  16.  
  17. foreach ($tab as $row1)
  18. {
  19. if ($row1['ilosc'] == $ilosc[0])
  20. {
  21. foreach ($tab as $row2)
  22. {
  23. if ($row2['ilosc'] == $ilosc[1])
  24. {
  25. foreach ($tab as $row3)
  26. {
  27. if ($row3['ilosc'] == $ilosc[2])
  28. {
  29. foreach ($tab as $row4)
  30. {
  31. if ($row4['ilosc'] == $ilosc[3])
  32. {
  33. foreach ($tab as $row5)
  34. {
  35. if ($row5['ilosc'] == $ilosc[4])
  36. {
  37. $znalezione[] = $row1['nazwa'].' '.$row2['nazwa'].' '.$row3['nazwa'].' '.$row4['nazwa'].' '.$row5['nazwa'];
  38. }
  39. }
  40. }
  41. }
  42. }
  43. }
  44. }
  45. }
  46. }
  47. }
  48.  
  49. /**
  50.  * Z tego przykładu, gdy dałem echo count($znalezione); to miałem aż 512 kombinacji.
  51.  *
  52.  * Dodanie tylko jednej wartości do $tab (np. 10 => array('ilosc' => 1, 'nazwa' => 'jedynka 5')) zwiększa ilość kombinacji z 512 do 800.
  53.  */

A wiec chodzi o to, żeby dopasowało idealnie ze sobą 5 różnych wpisów. Wszystko było OK, gdy $tab miało około 20-30 wpisów. Ale przy 2500 wpisów skrypt poległ. Czy macie jakieś pomysł na to? A może macie przy okazji pomysł, jak to zrobić, żeby było to uniwersalne np. zależne od zmiennej $count, i np. jakby jej wartość była równa 5 to by się zagnieżdżało 5 razy, a jakby było równe 10, to zagnieżdżało się 10 razy (czyli dopasowywało by ze sobą 10 różnych wpisów). Ale co do uniwersalności nie musi być. Ważne, by skrypt był optymalny. Ważne, że musi mi wszystkie możliwe kombinacje dać. Z góry dziękuję za pomoc smile.gif

Ten post edytował in5ane 21.11.2013, 20:26:06


--------------------
> > > Tworzenie stron < < <
Go to the top of the page
+Quote Post
werdan
post 21.11.2013, 23:42:24
Post #2





Grupa: Zarejestrowani
Postów: 354
Pomógł: 100
Dołączył: 14.11.2013
Skąd: Płock

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


  1. <?php
  2. $tab = array(
  3. 0 => array('ilosc' => 1, 'nazwa' => 'jedynka 1'),
  4. 1 => array('ilosc' => 2, 'nazwa' => 'dwojka 1'),
  5. 2 => array('ilosc' => 3, 'nazwa' => 'trojka 1'),
  6. 3 => array('ilosc' => 2, 'nazwa' => 'dwojka 2'),
  7. 4 => array('ilosc' => 2, 'nazwa' => 'dwojka 3'),
  8. 5 => array('ilosc' => 1, 'nazwa' => 'jedynka 2'),
  9. 6 => array('ilosc' => 1, 'nazwa' => 'jedynka 3'),
  10. 7 => array('ilosc' => 3, 'nazwa' => 'trojka 2'),
  11. 8 => array('ilosc' => 2, 'nazwa' => 'dwojka 4'),
  12. 9 => array('ilosc' => 1, 'nazwa' => 'jedynka 4')
  13. );
  14.  
  15. $ilosc = array(0 => 1, 1, 2, 2, 3);
  16. $iloscs = implode("",$ilosc);
  17.  
  18. $a = array();
  19.  
  20. foreach($tab as $t){
  21. $a[] = $t['ilosc'];
  22. }
  23.  
  24. $as = implode("", $a);
  25. $pos = strpos($as, $iloscs);
  26.  
  27. $res = array();
  28. if($pos !== false){
  29. for($i = $pos; $i < $pos + count($ilosc);$i++){
  30. $res[] = $tab[$i]['nazwa'];
  31. }
  32. print_r($res);
  33. }
  34.  


Może to Ci pomoże biggrin.gif
Go to the top of the page
+Quote Post
in5ane
post 21.11.2013, 23:50:36
Post #3





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


Niestety, ale nie wyświetla to nic.


--------------------
> > > Tworzenie stron < < <
Go to the top of the page
+Quote Post
werdan
post 21.11.2013, 23:52:57
Post #4





Grupa: Zarejestrowani
Postów: 354
Pomógł: 100
Dołączył: 14.11.2013
Skąd: Płock

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


Zrob, aby pasował wzór do wartosci w $tab.


  1. $ilosc = array(1, 1, 3, 2, 1);


Ten post edytował werdan 21.11.2013, 23:53:55
Go to the top of the page
+Quote Post
in5ane
post 21.11.2013, 23:56:15
Post #5





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


Niestety nie o to chodzi. Może ja dokładniej wyjaśnię. A więc mam:
  1. $ilosc = array(0 => 1, 1, 2, 2, 3);
i to oznacza pięć wybranych przez użytkownika pokoi (cyfra to iluosobowy, czyli jednoosobowy, jednoosobowy, dwuosobowy, dwuosobowy, trzyosobowy). Wzór pochodzi z wyszukiwarki. A $tab to jest tablica z dostępnymi pokojami (ilość to ilość osób w pokoju, a nazwa to opis). Tablica z dostępnymi pokojami jest generowana dynamicznie, więc również za każdym razem jest inna. I ma po prostu wyświetlić mi wszystkie możliwe kombinacje tych pokoi według wzoru wybranego przez użytkownika.

Ten post edytował in5ane 22.11.2013, 00:22:32


--------------------
> > > Tworzenie stron < < <
Go to the top of the page
+Quote Post
werdan
post 22.11.2013, 00:23:27
Post #6





Grupa: Zarejestrowani
Postów: 354
Pomógł: 100
Dołączył: 14.11.2013
Skąd: Płock

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


  1. <?php
  2. $tab = array(
  3. 0 => array('ilosc' => 1, 'nazwa' => 'jedynka 1'),
  4. 1 => array('ilosc' => 2, 'nazwa' => 'dwojka 1'),
  5. 2 => array('ilosc' => 3, 'nazwa' => 'trojka 1'),
  6. 3 => array('ilosc' => 2, 'nazwa' => 'dwojka 2'),
  7. 4 => array('ilosc' => 2, 'nazwa' => 'dwojka 3'),
  8. 5 => array('ilosc' => 1, 'nazwa' => 'jedynka 2'),
  9. 6 => array('ilosc' => 1, 'nazwa' => 'jedynka 3'),
  10. 7 => array('ilosc' => 3, 'nazwa' => 'trojka 2'),
  11. 8 => array('ilosc' => 2, 'nazwa' => 'dwojka 4'),
  12. 9 => array('ilosc' => 1, 'nazwa' => 'jedynka 4')
  13. );
  14.  
  15. $ilosc = array(1, 1, 2, 2, 3);
  16.  
  17.  
  18. $a = array();
  19. $rooms = array();
  20. foreach($tab as $t){
  21. if(!isset($a[$t['ilosc']])){
  22. $a[$t['ilosc']] = 1;
  23. } else {
  24. $a[$t['ilosc']]++;
  25. }
  26. if(!isset($rooms[$t['ilosc']])){
  27. $rooms[$t['ilosc']] = array();
  28. }
  29. $rooms[$t['ilosc']][] = $t['nazwa'];
  30. }
  31.  
  32. $b = array();
  33. foreach($ilosc as $t){
  34. if(!isset($b[$t])){
  35. $b[$t] = 1;
  36. } else {
  37. $b[$t]++;
  38. }
  39. }
  40.  
  41. for($i = 1; $i < max($ilosc); $i++){
  42. if($b[$i] > $a[$i]){
  43. print "Brak odpowiedniej liczby pokoi";
  44. $break = true;
  45. break;
  46. }
  47. }
  48.  
  49. if(!isset($break)){
  50.  
  51. foreach($ilosc as $il){
  52. print $il.": ".implode(", ", $rooms[$il]).PHP_EOL;
  53. }
  54. }
  55.  


Skrypt wyswietla tylko nazwy pokoju bez kombinacji.

Pomoc do kombinacji:
http://stackoverflow.com/questions/1022283...-of-a-php-array


Go to the top of the page
+Quote Post
in5ane
post 22.11.2013, 10:25:00
Post #7





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


Podziękować smile.gif

Niestety, ale to się nie sprawdziło. Ma ktoś inne pomysły?


--------------------
> > > Tworzenie stron < < <
Go to the top of the page
+Quote Post
werdan
post 22.11.2013, 17:23:09
Post #8





Grupa: Zarejestrowani
Postów: 354
Pomógł: 100
Dołączył: 14.11.2013
Skąd: Płock

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


Mogłbyś, jak małemu dziecku, wyjaśnić wszystko jeszcze raz. Zwłaszcza co dokładnie chcesz uzyskać (daj jakiś przykład) oraz czemu skrypt powyzej nie spełnia twoich oczekiwań biggrin.gif

Może coś pomoge, ale musze mieć pełną wizje problemu nerdsmiley.png
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 Wersja Lo-Fi Aktualny czas: 14.08.2025 - 08:53