Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak zrobić rekurencyjny foreach, rezultat w ostatniej pętli
Forum PHP.pl > Forum > PHP
radiopraca
Jak napisać funkcję która robi foreach k-razy.
Przesyłam przykład z k = 4

  1. foreach ($aaa as $aa) {
  2. $newProducts = array_diff($products, $aa);
  3. $newProducts = array_values($newProducts);
  4. $bbb = go2($newProducts);
  5.  
  6. foreach ($bbb as $bb) {
  7. $newProducts2 = array_diff($newProducts, $bb);
  8. $newProducts2 = array_values($newProducts2);
  9. $ccc = go2($newProducts2);
  10.  
  11. foreach ($ccc as $cc) {
  12. $newProducts3 = array_diff($newProducts2, $cc);
  13. $newProducts3 = array_values($newProducts3);
  14.  
  15. $out[] = array(
  16. $aa,
  17. $bb,
  18. $cc,
  19. $newProducts3
  20. );
  21. }
  22. }
  23. }


Rekurencyjne FOR-y już kumam i sobie radze, ale tutaj cała akcja toczy się w ostatnim foreachu.
Walcze z tym już od rana, na razie mam tak, ale to nie działa, pomoze ktoś?


  1. function xxx($products, $partials, $i = 0, $part) {
  2.  
  3. if ($i < 1) {
  4. foreach ($partials as $part) {
  5. $newProducts = array_diff($products, $part);
  6. $newProducts = array_values($newProducts);
  7. $bbb = go2($newProducts);
  8.  
  9. $partial = array_megre($part, $bbb);
  10.  
  11. xxx($newProducts, $bbb, ++$i, $partial);
  12. }
  13. }
  14. }
Pyton_000
A może napiszesz do czego Ci to? Bo może jest inne rozwiązanie Twojego problemu niż taki kwiatek
radiopraca
Skomplikowana sprawa. Ogólnie chodzi o pewien skomplikowany algorytm zbudowany z kilku klocków. To jest ostatni klocek który jest mi potrzebny. Ogólnie chodzi o wygenerowanie wszystkich przypadków kupienia X produktów w Y sklepach.

Mamy 2 sklepy i 3 produkty które chcemy w nich kupić. Możemy to zrobić na 8 sposobów.
1. a,bc
2. b,ac
3. c,ab
4. ab,c
5. ac,b
6. bc,a
7. -,abc
8. abc, -

Potrzebuje funkcji która zwracałaby mi wszystkie przypadki w zależności od produktów i ilości sklepów.

Mam już coś takiego, ale ciągle nie działa poprawnie:

  1. function xxx($products, $partials, $i = 0, $max = 3, $party=array(), &$out=array()) {
  2.  
  3. if ($i < $max) {
  4. foreach ($partials as $part) {
  5. $newProducts = array_diff($products, $part);
  6. $newProducts = array_values($newProducts);
  7. $partial[] = $part;
  8.  
  9. if (count($partial) < $max-1) {
  10. $bbb = go2($newProducts);
  11. xxx($newProducts, $bbb, ++$i, $max, $partial, $out);
  12. }
  13.  
  14. if (count($partial) == $max-1) {
  15. $partial[] = $newProducts;
  16. $out[] = $partial;
  17. $partial = array();
  18. }
  19. }
  20. }
  21.  
  22. return $out;
  23. }
gitbejbe
czasami nie ma co tracić czasu na wymyślanie czegoś, co już istnieje i jest łatwo dostępne. Google ma pełno podpowiedzi i gotowców. Na twój problem polecam frazę "php get all combinations of array".

wycięte z neta:
  1. print_r(AllPermutations(array('peter', 'paul', 'mary')));
  2.  
  3. function AllPermutations($InArray, $InProcessedArray = array())
  4. {
  5. $ReturnArray = array();
  6. foreach($InArray as $Key=>$value)
  7. {
  8. $CopyArray = $InProcessedArray;
  9. $CopyArray[$Key] = $value;
  10. $TempArray = array_diff_key($InArray, $CopyArray);
  11. if (count($TempArray) == 0)
  12. {
  13. $ReturnArray[] = $CopyArray;
  14. }
  15. else
  16. {
  17. $ReturnArray = array_merge($ReturnArray, AllPermutations($TempArray, $CopyArray));
  18. }
  19. }
  20. return $ReturnArray;
  21.  
  22. //LUB
  23.  
  24. function pc_permute($items, $perms = array()) {
  25. if (empty($items)) {
  26. echo join(' ', $perms) . "</br>";
  27. } else {
  28. for ($i = count($items) - 1; $i >= 0; --$i) {
  29. $newitems = $items;
  30. $newperms = $perms;
  31. list($foo) = array_splice($newitems, $i, 1);
  32. array_unshift($newperms, $foo);
  33. pc_permute($newitems, $newperms);
  34. }
  35. }
  36. }
  37.  
  38. $arr = array('peter', 'paul', 'mary');
  39.  
  40. pc_permute($arr);
  41.  
  42. }
radiopraca
Tylko ja potrzebuję przekazać jeszcze ilość sklepów. Kod który podesłałeś zwraca wszystkie kombinacje dla X produktów.
Brakuje najważniejszego czyli to żeby uwzględniał jeszcze ilość sklepów.

Musze kupić mąke, chleb i cukier. Mam do wyboru: biedronkę, lidla i tesco.
Znam ceny wszystkich produktów we wszystkich marketach.
Chcę aby skrypt obliczał wszystkie przypadki zakupu 3 rzeczy w 3 marketach (jest ich 27) i zwracał mi te przypadki.
Ja sobie obliczę gdzie musze zrobić zakupy żebym zapłacił najmniej.

Np. Najtaniej za zakupy zapłacisz gdy: mąkę i chleb kupisz w lidlu a cukier w tesco.

Przykadowe wywołanie:
Produkty to array('mąka', 'cukier', 'chleb') a ilośc sklepów to int (3)
ghost1511
A nie będzie prościej jeżeli będziesz sprawdzał każdy produkt z osobna? Np produkt "MĄKA" jest najtańsza w sklepie: "LIDL"? Bo wydaje mi się, że większa ilość produktów i sklepów może być kłopotliwa i funkcja rośnie wykładniczo.
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.