Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Kombinacje elementów tablicy bez powtórzeń
andyet
post
Post #1





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 3.04.2011

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


Witam. Chciałbym wypisać wszystkie kombinacje elementów tablicy bez powtórzeń gdzie zbór wynosi 4, a elementy 3. Dla 2 elementów mam takie coś:

CODE
<?
$tab1[0] = 1;
$tab1[1] = 2;
$tab1[2] = 3;
$tab1[3] = 4;
$ilosc=count($tab1);
$tab2 = $tab1;
for($i=0;$i<$ilosc;$i++)
{
$j=$i+1;
while($j<$ilosc)
{
echo $tab1[$i].','.$tab2[$j].'<br/>';
$j++;
}
}
?>


Próbowałem dodać zmienną k i wygląda to tak po przeróbce:

CODE
<?
$tab1[0] = 1;
$tab1[1] = 2;
$tab1[2] = 3;
$tab1[3] = 4;
$ilosc=count($tab1);
$tab2 = $tab1;
$tab3 = $tab1;
for($i=0;$i<$ilosc;$i++)
{
$j=$i+1;
$k=$j+1;
while($j<$ilosc && $k<$ilosc)
{
echo $tab1[$i].','.$tab2[$j].','.$tab3[$k].'<br/>';
$j++;
$k++;
}
}
?>


Niestety nie działa to prawidłowo, gdy mam zbiór liczb 1,2,3,4 to wynikiem jest:
1,2,3
1,3,4
2,3,4
Ucieka jedna kombinacja:
1,2,4

Proszę o pomoc.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
peter13135
post
Post #2





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

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


  1. <?
  2.  
  3.  
  4. $array = array();
  5.  
  6. for ($a = 1; $a < 5; $a++)
  7. for ($b = 1; $b < 5; $b++)
  8. for ($c = 1; $c < 5; $c++)
  9. $array[] = array($a, $b, $c);
  10.  
  11. foreach ($array as & $a)
  12. {
  13. sort($a);
  14. }
  15. sort($array);
  16.  
  17. $count = count($array);
  18. $tmp = $array[0];
  19. for ($i = 1; $i < $count; $i++)
  20. {
  21. if ($array[$i] == $tmp)
  22. unset($array[$i]);
  23. else
  24. $tmp = $array[$i];
  25. }
  26.  
  27. $out = array();
  28. foreach ($array as & $arr)
  29. {
  30. $a = array_count_values($arr);
  31.  
  32. sort($a);
  33. if (count($arr) == 3 && end($a) == 1)
  34. {
  35. $out[] = $arr;
  36. }
  37.  
  38. }
  39. echo '<pre>';
  40. print_r($out);
  41. echo '</pre>';
  42.  
  43. ?>



Działa, ale lepiej się tym nie chwalić profesorowi od algorytmiki (IMG:style_emoticons/default/biggrin.gif) :D

edit://

tutaj masz lepszą wersję, chociaż też nie idealna.

  1. <?
  2. $array = array();
  3.  
  4. for ($a = 1; $a < 5; $a++)
  5. for ($b = 1; $b < 5; $b++)
  6. for ($c = 1; $c < 5; $c++)
  7. {
  8. $tmp = array($a, $b, $c);
  9. $arv = array_count_values($tmp);
  10. sort($arv);
  11. if(end($arv)==1)
  12. {
  13. sort($tmp);
  14. if(!in_array($tmp,$array))
  15. {
  16. $array[] = $tmp;
  17. }
  18. }
  19.  
  20. }
  21. print_r($array);
  22. ?>


Ten post edytował peter13135 6.09.2011, 16:16:28
Go to the top of the page
+Quote Post
andyet
post
Post #3





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 3.04.2011

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


Wszystko fajnie działa, tylko jak to przerobić tak, że np. do tablicy zapisuję 4liczby dowolne i z tych 4 liczb wypisuje mi wszystkie ich kombinacje bez powtórzeń?
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.09.2025 - 16:10