Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skrypt obliczania kombinacji
Forum PHP.pl > Forum > PHP
nikestylex7
Witam mam problem gdyż nie wiem jak mam to zrobić napisałem funkcje
  1. $liczby = array( '1','X','2' );
  2. $kombinacje = array();
  3.  
  4. for( $a = 0; $a < count( $liczby ); $a++ ) {
  5. for( $b = 0; $b < count( $liczby ); $b++ ) {
  6. for( $c = 0; $c < count( $liczby ); $c++ ) {
  7. for( $d = 0; $d < count( $liczby ); $d++ ){
  8. $kombinacje[] = $liczby[$a]. $liczby[$b]. $liczby[$c]. $liczby[$d];
  9. }
  10. }
  11. }
  12. }
  13. echo '<pre>';
  14. print_r( $kombinacje );
  15. echo '</pre>';

która wyświetla wszystkie z możliwych kombinacji 4 spotkań na jednym kuponie i printuje mi to wszystko na ekranie lecz chciałbym żeby to wyglądało trochę inaczej.


Wszystko ładnie pięknie lecz chciałbym żeby ilośc spotkań na 1 kuponie było można zmienić ( nie chodzi mi tutaj o dodanie kolejnej pętli for wink.gif ) na max 10 oraz po kliknięciu kalkuluj żeby kombinacje wyświetliłlo tak że jest nazwa x nazwa : 1 nazwa1 x nazwa1 : 2 chodzi tutaj żeby nie było czegoś takiego 1122X2 chciałbym żeby każda kombinacja była przypisana do jakiejś nazwy oraz żeby jak kupon ma np 4 kombinacje to wyglada tak kupon1 nazwa x nazwa : 1 nazwa2 x nazwa2 : 2 nazwa3 x nazwa3: 1 nazwa4 x nazwa4 : X i tak wszystkie kombinacje kupon2 kupon3 ......Proszę o pomoc gdyż stoje od pewnego czasu w miejscu i się ruszyć nie mogę.
lukaskolista
Poczytaj o funkcjach rekurencyjnych. Jak zrozumiesz temat, to Twoj kod duzo sie uprosci i bedzie duzo bardziej elastyczny (osiagniesz swoj cel).
thek
Określ jakiś wzorzec nazwy, dorzuć dodatkowy licznik i go w najgłebszym miejscu inkrementuj. Dorzuć tam też IF, który sprawdza modulo. Jeśli osiągnie ono określoną wartość możesz inkrementować dodatkową zmienną i z niej składaj sobie ów wzorzec nazwy. Przykład to zmodyfikowany Twój będzie:
  1. $liczby = array( '1','X','2' );
  2. $kupon = 0; //specjalnie zaczynam od 0, bo pierwszy cykl od razu nam zamieni zmieną $kupon na 1
  3. $licznik = 0; //to nam będzie się ciagle zmieniać
  4. $wzorzec = 'kupon_';
  5. $ilosc_na_kuponie = 10
  6. $kombinacje = array();
  7. for( $a = 0; $a < count( $liczby ); $a++ ) {
  8. for( $b = 0; $b < count( $liczby ); $b++ ) {
  9. for( $c = 0; $c < count( $liczby ); $c++ ) {
  10. for( $d = 0; $d < count( $liczby ); $d++ ) {
  11. if(0 === $licznik%$ilosc_na_kuponie) {
  12. ++$kupon; // to nam stworzy klucze w tablicy, w stylu "kupon_1", "kupon_2" itd
  13. }
  14. ++$licznik;
  15. $kombinacje[$wzorzec.$kupon][] = $liczby[$a]. $liczby[$b]. $liczby[$c]. $liczby[$d]; // a to nam utworzy właściwe tablice z kombinacjami kuponów
  16. }
  17. }
  18. }
  19. }
  20. echo '<pre>';
  21. print_r( $kombinacje );
  22. echo '</pre>';

To co możesz chcieć zmienić to format wyświetlania numerów kuponów na przykładowo kupon_00001 czy podobne detale estetyczne. A to na co powinieneś uważać to $licznik. Przy dużych ilościach elementów możesz przekroczyć zakres inta. W takim wypadku lepiej inkrementować $licznik, ale gdy dojdzie on do liczby kombinacji na kuponie zgodnej z modulo - wyzerować.

Inna sprawa, że to co zrobiłeś nie jest ok. Modyfikowanie liczby elementów w tablicy $liczby skutkuje modyfikacjami w ilości pętli FOR, co do najlepszych rozwiązań nie należy. Powinieneś zamienić to na funkcję sensowniejszą. Najwygodniej chyba jeśli byłaby rekurencyjna. Ale to już zostawiam Ci na zadanie domowe do przemyślenia smile.gif
Mlodycompany
Dodam jeszcze od siebie, że sprawdzanie ilości elementów tablicy w pętli nie jest zbyt optymalne, gdyż za każdym razem cyklem pętli jest to sprawdzane. Lepiej to nad pętlą do zmiennej wpakować i do pętli wstawić zmienna.
  1. for( $a = 0; $a < count( $liczby ); $a++ )
  2. na
  3. $cliczby = count( $liczby );
  4. for( $a = 0; $a < $cliczby; $a++ ) {
nikestylex7
Badzo dziękuje za zainteresowanie lecz dałem gafe i trochę wprowadziłem was w błąd nie jestem tak dobry jak wy dlatego mam znowu problem zrobiłem tak jak mlody zapodał fajnie bo pokazuje kombinacje lecz nie tak jak chcialem gdyż nie chce żeby to wszystko było w tablicy to psuje efekt.
  1. $liczby = array( '1','X','2' );
  2. $kupon = 0; //specjalnie zaczynam od 0, bo pierwszy cykl od razu nam zamieni zmieną $kupon na 1
  3. $licznik = 0; //to nam będzie się ciagle zmieniać
  4. $wzorzec = 'kupon_';
  5. $ilosc_na_kuponie = 10;
  6. $kombinacje = array();
  7. $cliczby = count( $liczby );
  8. for( $a = 0; $a < $cliczby; $a++ ) {
  9. for( $b = 0; $b < $cliczby; $b++ ) {
  10. for( $c = 0; $c < $cliczby; $c++ ) {
  11. for( $d = 0; $d < $cliczby; $d++ ) {
  12. if(0 === $licznik%$ilosc_na_kuponie) {
  13. ++$kupon; // to nam stworzy klucze w tablicy, w stylu "kupon_1", "kupon_2" itd
  14. }
  15. ++$licznik;
  16. $kombinacje[$wzorzec.$kupon][] = $liczby[$a]. $liczby[$b]. $liczby[$c]. $liczby[$d]; // a to nam utworzy właściwe tablice z kombinacjami kuponów
  17. }
  18. }
  19. }
  20. }
  21. echo '<pre>';
  22. print_r( $kombinacje );
  23. echo '</pre>';

a to efekt :

Powinno mniej wiecej wygladac tak

to mniej więcej powinno tak wyglądać gdyż mamy 4 zapętlenia w skrypcie to 4 spotkania na kupon i tych kuponów aż 81 tyle co kombinacji

Teraz już rozumiecie mój przekaz może wcześniej jakoś źle to opisałem.


Zerknie ktoś?

?

?

?
Mlodycompany
to jak sobie wyświetlisz wyniki to tylko i wyłącznie Twoja wyobraźnia i chęć, tablica raz, że nie ma nic do tego a dwa to nie przeszkadza, a wręcz przeciwnie - ułatwia kontrolę nad takimi danymi
nikestylex7
Tylko że nie wiem jak mam się za to wziąć nie chce gotowca lecz jakiegoś światełka w tunelu jak zmienić tablice w normalnie wyświtlane wyniki oraz jak je podzieli żeby nie były w kupie 1x12 tylko oddzielnie nazwa : 1 nazwa: x nazwa:1 nazwa 2
L00zak
  1. <?
  2. $dane = implode(";", $tablica);
  3. ?>
Mlodycompany
a mi się wydaje, że Ty zupełnie nie pojmujesz tablic i nie wiesz jak z nich korzystać. jeżeli to prawda to polecam lekturę manuala
L00zak
że kto?smile.gif
Mlodycompany
że autor
L00zak
każdemu się zdarza, ja np. borykam się z odkodowaniem strumienia gzip ze stringa i nic nie pomaga poza zapisem do pliku i rozpakowaniem hehe, a pewnie też jakiś głupi błąd
nikestylex7
Przerobiłem trochę skrypt tylko nie wiem jak zrobić z niego konkretnie to o co mi chodzi. Spotkań maksymalnie może być 10. Gdy osoba w formularzu chce 9 spotkań zamiast 10 to żeby nie wliczało tego 10 czyli dodatkowych kombinacji do kuponów. Nie wiem jak to zrobić jedyne rozwiązanie które mógłbym zastosować to sprawdzanie czy w formularzu osoba wypełniła nazwę spotkania jeśli nie to nie wlicza tego do kombinacji lecz nie wiem czy to jest optymalne.
  1. $liczby = array( '1','X','2' );
  2. $kupon = 0; //specjalnie zaczynam od 0, bo pierwszy cykl od razu nam zamieni zmieną $kupon na 1
  3. $licznik = 0; //to nam będzie się ciagle zmieniać
  4. $wzorzec = 'kupon_';
  5. $nazwa1= 'Arsenal - Barcelona :';
  6. $nazwa2= 'Manchester United - Arsenal :';
  7. $nazwa3= 'Barcelona - Manchester City :';
  8. $nazwa4= 'AC Milan - Juventus :';
  9. $nazwa5= 'Legia Warszawa - Pogoń Szczecin :';
  10. $nazwa6= 'Pogoń Szczecin - Manchester United :';
  11. $nazwa7= 'Borussia Dortmund - Arsenal :';
  12. $nazwa8= 'Barcelona - Pogoń Szczecin :';
  13. $nazwa9= 'Barcelona - Legia Warszawa :';
  14. $nazwa10= 'Barcelona - Arsenal :';
  15. $kombinacje = array();
  16. $ilosc_na_kuponie=1; //ilość spotkań na kuponie
  17. $cliczby = count( $liczby );
  18. for( $a = 0; $a < $cliczby; $a++ ) {
  19. for( $b = 0; $b < $cliczby; $b++ ) {
  20. for( $c = 0; $c < $cliczby; $c++ ) {
  21. for( $d = 0; $d < $cliczby; $d++ ) {
  22. for( $e = 0; $e < $cliczby; $e++ ) {
  23. for( $f = 0; $f < $cliczby; $f++ ) {
  24. for( $g = 0; $g < $cliczby; $g++ ) {
  25. for( $h = 0; $h < $cliczby; $h++ ) {
  26. for( $i = 0; $i < $cliczby; $i++ ) {
  27. for( $j = 0; $j < $cliczby; $j++ ) {
  28. if(0 === $licznik%$ilosc_na_kuponie) {
  29. ++$kupon; // to nam stworzy klucze w tablicy, w stylu "kupon_1", "kupon_2" itd
  30. }
  31. ++$licznik;
  32. $kombinacje[$wzorzec.$kupon] = '<br />'.$nazwa10.$liczby[$j].'<br />'.$nazwa9.$liczby[$i].'<br />'.$nazwa8.$liczby[$h].'<br />'.$nazwa7.$liczby[$g].'<br />'.$nazwa6.$liczby[$f].'<br />'.$nazwa5.$liczby[$e].'<br />'.$nazwa4.$liczby[$d].'<br />'.$nazwa3.$liczby[$c].'<br />'.$nazwa2.$liczby[$b].'<br />'.$nazwa1.$liczby[$a]; // a to nam utworzy właściwe tablice z kombinacjami kuponów
  33. }
  34. }
  35. }
  36. }
  37. }
  38. }
  39. }
  40. }
  41. }
  42. }
  43.  
  44. echo '<pre>';
  45. print_r( array_slice($kombinacje,0,100) );
  46. echo '</pre>';


Zastanawiam się czy dało by radę stworzyć funkcję rekurencyjna do jednego zdarzenia i umieścić ją w pętli zdarzeń że osoba chce np 4 to pętla przerobi funkcję tyle razy
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.