Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Jak zrobić rekurencyjny foreach, rezultat w ostatniej pętli
radiopraca
post 10.02.2014, 19:57:11
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 1
Dołączył: 7.02.2014

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


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. }
Go to the top of the page
+Quote Post
Pyton_000
post 10.02.2014, 21:40:34
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


A może napiszesz do czego Ci to? Bo może jest inne rozwiązanie Twojego problemu niż taki kwiatek
Go to the top of the page
+Quote Post
radiopraca
post 10.02.2014, 21:54:57
Post #3





Grupa: Zarejestrowani
Postów: 14
Pomógł: 1
Dołączył: 7.02.2014

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


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. }


Ten post edytował radiopraca 10.02.2014, 21:56:30
Go to the top of the page
+Quote Post
gitbejbe
post 10.02.2014, 22:02:14
Post #4





Grupa: Zarejestrowani
Postów: 516
Pomógł: 63
Dołączył: 27.08.2012

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


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. }


Ten post edytował gitbejbe 10.02.2014, 22:05:39
Go to the top of the page
+Quote Post
radiopraca
post 10.02.2014, 22:18:39
Post #5





Grupa: Zarejestrowani
Postów: 14
Pomógł: 1
Dołączył: 7.02.2014

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


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)

Ten post edytował radiopraca 10.02.2014, 22:20:27
Go to the top of the page
+Quote Post
ghost1511
post 11.02.2014, 08:07:46
Post #6





Grupa: Zarejestrowani
Postów: 186
Pomógł: 18
Dołączył: 2.09.2010

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


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.
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 Wersja Lo-Fi Aktualny czas: 13.07.2025 - 03:43