[PHP] Alle mogelijke combinaties van array weergeven

Pagina: 1
Acties:
  • 117 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mrbombastic
  • Registratie: Oktober 2002
  • Laatst online: 13-02 21:29
Ik heb een array met 8 elementen.
De bedoeling is dat de gebruiker kan aangeven hoeveel elementen hij uit die 8 wil halen en hiervan moeten dan alle mogelijke combinaties weergegeven worden.
Ik heb al wel een manier gevonden om dit te realiseren maar deze is zwaar inefficient.
Het moet ook met een functie kunnen maar dat lukt me maar niet.

Inefficiente code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php
error_reporting(E_ALL);

function my_loop($size) {
   $numbers = array('1','5','20','500','2.500','5.000','10.000','2.500.000');
   $count = count($numbers);
   $combinations=0;
   if($size==6) {
      echo "Combinaties van $size<br>\n";
      for($i=0;$i<$count;$i++) {
          for($j=$i+1;$j<$count;$j++) {
              for($k=$j+1;$k<$count;$k++) {
                  for($l=$k+1;$l<$count;$l++) {
                      for($m=$l+1;$m<$count;$m++) {
                          for($n=$m+1;$n<$count;$n++) {
                              echo "$numbers[$i]<br>$numbers[$j]<br>$numbers[$k]<br>$numbers[$l]<br>$numbers[$m]<br>$numbers[$n]<br><br>\n";
                              $combinations++;
                          }
                       }
                   }
               }
           }
       }
    }

   if($size==5) {
      echo "Combinaties van $size<br>\n";
      for($i=0;$i<$count;$i++) {
          for($j=$i+1;$j<$count;$j++) {
              for($k=$j+1;$k<$count;$k++) {
                  for($l=$k+1;$l<$count;$l++) {
                      for($m=$l+1;$m<$count;$m++) {
                          echo "$numbers[$i]<br>$numbers[$j]<br>$numbers[$k]<br>$numbers[$l]<br>$numbers[$m]<br><br>\n";
                          $combinations++;
                      }
                  }
               }
           }
       }
   }

   if($size==4) {
      echo "Combinaties van $size<br>\n";
      for($i=0;$i<$count;$i++) {
          for($j=$i+1;$j<$count;$j++) {
              for($k=$j+1;$k<$count;$k++) {
                  for($l=$k+1;$l<$count;$l++) {
                      echo "$numbers[$i]<br>$numbers[$j]<br>$numbers[$k]<br>$numbers[$l]<br><br>\n";
                      $combinations++;
                  }
               }
          }
      }
   }

   if($size==3) {
      echo "Combinaties van $size<br>\n";
      for($i=0;$i<$count;$i++) {
          for($j=$i+1;$j<$count;$j++) {
              for($k=$j+1;$k<$count;$k++) {
                  echo "$numbers[$i]<br>$numbers[$j]<br>$numbers[$k]<br><br>\n";
                  $combinations++;
              }
          }
      }
   }

   if($size==2) {
      echo "Combinaties van $size<br>\n";
      for($i=0;$i<$count;$i++) {
          for($j=$i+1;$j<$count;$j++) {
              echo "$numbers[$i]<br>$numbers[$j]<br><br>\n";
              $combinations++;
          }
      }
   }

   if($size==1) {
      echo "Combinaties van $size<br>\n";
      for($i=0;$i<$count;$i++) {
          echo "$numbers[$i]<br><br>\n";
          $combinations++;
      }
   }

   echo "Totaal aantal combinaties: $combinations<br><br>\n";
}

my_loop($input);

?>



Code die ik tot nu toe heb, maar niet werkt
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

function my_loop($size) {
   $numbers = array('1','5','20','500','2.500','5.000','10.000','2.500.000');
   $count = count($numbers);
   $current=0;
   for($i=$current;$i<$count;$i++) {
       echo "$numbers[$i]<br>";
       $current++;
       if($current<=$size) {
       my_loop($size);
       }
   }
}

my_loop($input);
?>


Edit: search werkt niet ;(

[ Voor 13% gewijzigd door mrbombastic op 07-04-2004 17:59 ]

Before me there was many, after me there will be none. I'm the one!


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
offtopic:
Zie ook het mededelingenforum voor de oplossing voor de search...

Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Alle combinaties, wat bedoel je er precies mee, unieke combinaties ? of Elke combinatie ie:
2 uit ( 1, 2, 3)
Kan je 1,2 ^ 1,3 ^ 2,3 hebben als het alleen unieke combinaties zijn.
Is het geen unieke combinatie zit er ook nog 2,1 e.d. in.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 12:54
Je komt toch al gauw bij statistiek terecht, kansrekening, en dan in de hoek van permutaties "n!" / variaties "n!/(n-k)!" / combinaties "n boven k == n!/(n-k)!*k!". Maar welke hier van toepassing is, is niet aan mij besteed want statistiek is nooit mijn sterkste punt geweest.

Acties:
  • 0 Henk 'm!

  • mrbombastic
  • Registratie: Oktober 2002
  • Laatst online: 13-02 21:29
dusty schreef op 07 april 2004 @ 21:51:
Alle combinaties, wat bedoel je er precies mee, unieke combinaties ? of Elke combinatie ie:
2 uit ( 1, 2, 3)
Kan je 1,2 ^ 1,3 ^ 2,3 hebben als het alleen unieke combinaties zijn.
Is het geen unieke combinatie zit er ook nog 2,1 e.d. in.
Stel de array bestaat uit 4 elementen (1,2,3,4).
Dan wil ik hebben:
Combinaties van 1 element:
1
2
3
4
Totaal 4 (4 boven 1)

Combinaties van 2 elementen:
1-2
1-3
1-4
2-3
2-4
3-4
Totaal 6 (4 boven 2)

Combinaties van 3 elementen:
1-2-3
1-2-4
1-3-4
2-3-4
Totaal 4 (4 boven 3)

Combinaties van 4 elementen:
1-2-3-4
Totaal 1 (4 boven 4)

Dus de volgorde is irrelevant.
En de kansrekening is hier inderdaad mee verbonden, het gaat om combinaties.
Maar dat is mijn probleem niet (in 2 opzichten: als econometrist zijnde en het is hier niet de hoofdzaak).
Mijn doel is niet om uit te rekenen hoeveel combinaties er zijn, maar om alle combinaties ook daadwerkelijk weer te geven.


Edit: heb net een oplossing van een vriend gekregen. :7
Bedankt voor het meedenken iig.

[ Voor 9% gewijzigd door mrbombastic op 08-04-2004 00:38 ]

Before me there was many, after me there will be none. I'm the one!


Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
Wil je je oplossing nog delen voor de search dan?

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

Verwijderd

Als je een database tot je beschikking hebt, dan zou je die kunnen gebruiken om je tabel te genereren, namelijk door middel van een group by cube. ( Oracle en MSSql ondersteunen dit, ik weet niet of MySQL dat doet )

- Maak een tabel met 1 record, met daarin al je waarden.
- voer het volgende sqlstatement uit (oracle syntax)
code:
1
Select veld1,veld2,veld3.....veldn from tabel group by cube (veld1,veld2,veld3....veldn)


Dit geeft je alle mogelijke combinaties van veld1,veld2,veld3....veldn

Acties:
  • 0 Henk 'm!

Verwijderd

Je tweede code bevat ook een fout.

Je blijft in een oneindige loop. Want $current is altijd kleiner dan $size als je eerst $current op 0 zet als je de functie opnieuw aanroept met dezelfde size. Ik denk dat het hem in regel 6 ($current = 0;) zit.

Ik denk dat dit beter zal werken.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$current = 0;

function my_loop($size)
{
  $numbers = array('1','5','20','500','2.500','5.000','10.000','2.500.000');
  $count = count($numbers);

  for ($i=$current;$i<$count;$i++)
  {
    echo "$numbers[$i]<br>";
    $current++;

    if($current<=$size)
    {
      my_loop($size);
    }
  }
}


Het niet de mogelijkheid om het te testen :(

[ Voor 57% gewijzigd door Verwijderd op 08-04-2004 11:25 ]


Acties:
  • 0 Henk 'm!

  • seweso
  • Registratie: Augustus 2003
  • Laatst online: 04-04-2018

seweso

de mouw is uit de aap

Verwijderd schreef op 08 april 2004 @ 11:10:
....

Het niet de mogelijkheid om het te testen :(
Dat kan wel, gewoon tussentijds echoën naar de browser (en daarbij wel rekening houden met het bufferen van IE).

code:
1
echo str_repeat(" ", 255) . "Joehoe ik zit nu hier en variabele var = $var <br />\n";

seweso's blog


Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
* bigtree heeft zitten puzzelen en kwam tot het volgende:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    function get_combis($left, $items, $prefix = array()) {
        $tmp_array = array();
        if ($items == 1) {
            $prefix = array_values($prefix);
            foreach($left as $key => $val) {
                $tmp_array[] = array_merge($prefix, array($val));
            }
        } elseif ($items > 1 && (sizeof($left) > $items)) {
            $n = sizeof($left);
            $left = array_values($left);
            for ($i = 0; $i < $n - $items; $i++) {
                $tmp_prefix = array($left[$i]);
                unset($left[$i]);
                $tmp_arrays = get_combis($left, $items - 1, array_merge($prefix, $tmp_prefix));
                $tmp_array = array_merge($tmp_array, $tmp_arrays);
            }
        } elseif ($items > 1) {
            $tmp_array = $left;
        }
        return $tmp_array;
    }
    

    $items_array = array('A', 'B', 'C', 'D');

    $tmp_array = get_combis($items_array, 1);
    print_r($tmp_array);

    $tmp_array = get_combis($items_array, 2);
    print_r($tmp_array);

    $tmp_array = get_combis($items_array, 3);
    print_r($tmp_array);

    $tmp_array = get_combis($items_array, 4);
    print_r($tmp_array);
Tadaa!

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:28
Dat kan wel wat korter hoor:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function combine($left, $items, $current=array())
{
    if($left == 0)
    {
        // doe hier wat je wilt met je combinatie
        echo implode(',', $current), '<br />';
    }
    else
    if(sizeof($items) > 0)
    {
        array_push($current, array_shift($items));
        combine($left-1, $items, $current);
        array_pop($current);
        combine($left, $items, $current);
    }  
}

combine(3, array('A','B','C','D'));

Uitvoer in dit voorbeeld:
code:
1
2
3
4
A,B,C
A,B,D
A,C,D
B,C,D

[ Voor 9% gewijzigd door Soultaker op 14-04-2004 20:55 ]


  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 18-08 18:12
Allereerst; ik weet dat deze thread oud is, echter heb ik in de search geen nieuwe threads gevonden over dit onderwerp. Bovendien blijft de informatie zo op één plek.

In de laatste post van Soultaker staat zijn oplossing die ik erg goed vind. Ik probeer echter het resultaat (de combinaties) op te vangen in 1 array die de functie teruggeeft. Dit is mijn code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function combine($left, $items, $current = array()) {

    $arrResults = array();
    
    if($left == 0) {
    
        $temp = implode(',', $current);
        return $temp;
        
    } elseif(count($items) > 0) {
            
        array_push($current, array_shift($items));
        
        if (($tmpResult = combine($left-1, $items, $current)) != NULL) {
            $arrResults[] = $tmpResult;
        }
        
        array_pop($current);
        
        if (($tmpResult  = combine($left, $items, $current)) != NULL) {
            $arrResults[] = $tmpResult;
        }
        
    } 
    
    return $arrResults; 
}

$results = combine(2, array('A','B','C','D'), array());
print_r($results);

Ik krijg wel een goed resultaat met alle combinaties, alleen zijn het arrays in arrays die ik terug krijg, zoals dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
    [0] => Array
        (
            [0] => A,B
            [1] => Array
                (
                    [0] => A,C
                    [1] => Array
                        (
                            [0] => A,D
                        )

                )
etc..

Terwijl ik zo'n array wil hebben:
code:
1
2
3
4
5
6
7
    [0] => Array
        (
            [0] => A,B
            [1] => A,C
            [2] => A,D
            [3] => etc....
        )

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
PHP:
1
$arrResults[] = $tmpResult;


vervangen door

PHP:
1
$arrResults = array_merge($arrResults, $tmpResult);


Volgens mij krijg je altijd arrays terug, dus dat zou geen problemen moeten opleveren ivm array-type-checking.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 18-08 18:12
Ja je hebt gelijk, en hij werkt,

Moest nog wel
PHP:
1
return $temp;

Vervangen met
PHP:
1
return array($temp);
Pagina: 1