Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Nieoptymalna pętla (zabija skrypt), jak inaczej?
Forum PHP.pl > Forum > Przedszkole
in5ane
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
werdan
  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
in5ane
Niestety, ale nie wyświetla to nic.
werdan
Zrob, aby pasował wzór do wartosci w $tab.


  1. $ilosc = array(1, 1, 3, 2, 1);
in5ane
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.
werdan
  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


in5ane
Podziękować smile.gif

Niestety, ale to się nie sprawdziło. Ma ktoś inne pomysły?
werdan
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
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.