Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Skrypt obliczania kombinacji
nikestylex7
post
Post #1





Grupa: Zarejestrowani
Postów: 386
Pomógł: 7
Dołączył: 22.04.2010
Skąd: Ziemia

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


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ę.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
lukaskolista
post
Post #2





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Poczytaj o funkcjach rekurencyjnych. Jak zrozumiesz temat, to Twoj kod duzo sie uprosci i bedzie duzo bardziej elastyczny (osiagniesz swoj cel).
Go to the top of the page
+Quote Post
thek
post
Post #3





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Mlodycompany
post
Post #4





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

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


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++ ) {
Go to the top of the page
+Quote Post
nikestylex7
post
Post #5





Grupa: Zarejestrowani
Postów: 386
Pomógł: 7
Dołączył: 22.04.2010
Skąd: Ziemia

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


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ś?

?

?

?

Ten post edytował nikestylex7 27.12.2012, 17:39:35
Go to the top of the page
+Quote Post
Mlodycompany
post
Post #6





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

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


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





Grupa: Zarejestrowani
Postów: 386
Pomógł: 7
Dołączył: 22.04.2010
Skąd: Ziemia

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


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





Grupa: Zarejestrowani
Postów: 58
Pomógł: 5
Dołączył: 2.05.2006

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


  1. <?
  2. $dane = implode(";", $tablica);
  3. ?>
Go to the top of the page
+Quote Post
Mlodycompany
post
Post #9





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

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


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





Grupa: Zarejestrowani
Postów: 58
Pomógł: 5
Dołączył: 2.05.2006

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


że kto?smile.gif
Go to the top of the page
+Quote Post
Mlodycompany
post
Post #11





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

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


że autor
Go to the top of the page
+Quote Post
L00zak
post
Post #12





Grupa: Zarejestrowani
Postów: 58
Pomógł: 5
Dołączył: 2.05.2006

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


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





Grupa: Zarejestrowani
Postów: 386
Pomógł: 7
Dołączył: 22.04.2010
Skąd: Ziemia

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


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
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: 20.08.2025 - 20:28