Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Jak napisać funkcję która wykona pętle FOR n-razy
Forum PHP.pl > Forum > PHP
radiopraca
Mam taki kod (poniżej) i wyświetla on wszystkie przypadki umieszczenia 4 osób w jednym pokoju.
W takim pokoju może być osoba 1, 2, 3, 4, 1 i 2, 1 i 3 itd.

Kod działa prawidłowo, ale jak trzeba by to poprawić by było uniwersalne i działało dla 1,2,3,4,5... n osób.
Nie chce robić 10 forów jeden w drugim. Pomożecie?

  1. $out = array();
  2. for ($a = 1; $a <= 4; $a++) {
  3. $out[] = $a;
  4.  
  5. for ($b = $a + 1; $b <= 4; $b++) {
  6. $out[] = $a. $b;
  7.  
  8. for ($c = $b + 1; $c <= 4; $c++) {
  9. $out[] = $a. $b. $c;
  10.  
  11. for ($d = $c + 1; $d <= 4; $d++) {
  12. $out[] = $a. $b. $c. $d;
  13. }
  14. }
  15. }
  16. }


Wykonanie kawałka kodu wyżej zwróci:
Array
  1. (
  2. [0] => 1
  3. [1] => 2
  4. [2] => 3
  5. [3] => 4
  6. [4] => 12
  7. [5] => 13
  8. [6] => 14
  9. [7] => 23
  10. [8] => 24
  11. [9] => 34
  12. [10] => 123
  13. [11] => 124
  14. [12] => 134
  15. [13] => 234
  16. [14] => 1234
  17. )


To wszystko jest jednak na sztywno dla 4 osób.
Wie ktoś może jak zrobić by pętli for było tyle ile osób (pętla w pętli)?
Kshyhoo
Wróżę: trzeba zastąpić liczbę 4 zmienną?
radiopraca
To też ale wówczas dla liczby 3 będą tylko 3 pętle for, a dla liczby 5 będzie 5 takich pętli.
Funkcja ma byc uniwersalna i ma obsługiwać dowolne wartości.
Nie bede przecież dla 10 robił 10 pętli for.

Dla 3 osob kod wyglada tak:
  1. $out = array();
  2. for ($a = 1; $a <= 4; $a++) {
  3. $out[] = $a;
  4.  
  5. for ($b = $a + 1; $b <= 4; $b++) {
  6. $out[] = $a. $b;
  7.  
  8. for ($c = $b + 1; $c <= 4; $c++) {
  9. $out[] = $a. $b. $c;
  10. }
  11. }
  12. }


Znika nam jedna petla for.
Kshyhoo
Dopisz tagi do tytułu, przenoszę wątek.
radiopraca
Przedszkole przedszkolem ale pomoższ mi rozwiązać problem kolego?
Greg0
Słowo klucz: funkcja rekurencyjna
radiopraca
Czy chodzi o coś takiego:

  1. function xxx($x, $y = 1) {
  2. $out = array();
  3.  
  4. if ($x > $y) {
  5. for ($a = $y; $a <= $x; $a++) {
  6. $out[] = $a;
  7.  
  8. xxx($x, $a + 1);
  9. }
  10. } else {
  11. return $out;
  12. }
  13. }


Nic nie zwraca mi to wywołanie xxx(4);
Coś chyba nie tak bo nie dopisuje tego a.b.c nigdzie.

Mam juz coś takiego, ale to ciągle nie to:

  1. function xxx($x, $y = 1, $out = array()) {
  2. if ($x > $y) {
  3. for ($a = $y; $a <= $x; $a++) {
  4. $out[] = $a;
  5.  
  6. xxx($x, $y + 1, $out);
  7. }
  8. }
  9.  
  10. return $out;
  11. }
Greg0
Widzę że próbowałeś więc nie mam oporów żeby ci dać gotowca do przeanalizowania.
  1. function kombinacje($n, $combine=null, $var=0, $out = array()) {
  2. for ($i = $var+1; $i <= $n; $i++)
  3. {
  4. $out[] = $combine.$i;
  5. $out = kombinacje($n, $combine.$i, $i, $out);
  6. }
  7.  
  8. return $out;
  9. }
  10.  
  11. print_r(kombinacje(4));
radiopraca
Dzięki. Trochę wczoraj nad tym siedziałem bo nie dało mi to spokoju i zrobiłem tak (też działa):

  1. function xxx($amount, $unit = 1, $part = array(), &$out = array()) {
  2. if ($amount >= $unit) {
  3. for ($i = $unit; $i <= $amount; ++$i) {
  4. $partial = array_merge($part, array($i));
  5. $out[] = $partial;
  6.  
  7. xxx($amount, $i + 1, $partial, $out);
  8. }
  9. }
  10.  
  11. return $out;
  12. }
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.