Autor Zpráva
ccomb
Profil *
co potrebuji:

mam array(pes, kocka, kun)
druhe array (evropa, amerika)
treti array (prvni, druha)

a potreboval bych vsechny kombinace (nebo jak se tomu spravne rika)

pes - evropa -prvni
pes -evropa - druha
pes - amerika - prvni
pes -amerika - druha
kocka -evropa - prvni
atd

prvku v polich muze byt ruzny pocet stejne tak poli.

nevidel nekdo neco podobneho hotoveho nebo nevi jak zacit?
ShiraNai7
Profil
Tak jsem to sepsal.. kod:

// testovaci pole
$pole = array(
	array('pes', 'kocka', 'godzilla'),
	array('evropa', 'tramtarie'),
	array('prvni', 'druha'),
);

// funkce
function kombinace($arrays, $index = 0)
{

	// priprava statickych promennych
	static $a, $l, $p, $o;
	if($index === 0) {
		$a = $arrays;
		$l = sizeof($arrays) - 1;
		$p = array();
	}

	// rekurzivni kombinovani
	for($i = 0; isset($a[$index][$i]); ++$i) {
		$p[] = $a[$index][$i];
		if($index !== $l) kombinace(null, $index + 1);
		else $o[] = $p;
		array_pop($p);
	}

	// navraceni vysledku (a vynulovani pouzitych stat. prom.)
	if($index === 0) {
		$a = $l = $p = null;
		$otmp = $o;
		$o = null;
		return $otmp;
	}

}

// zavolame funkci
print_r(kombinace($pole));


A výsledek volání výše je:

Array
(
    [0] => Array
        (
            [0] => pes
            [1] => evropa
            [2] => prvni
        )

    [1] => Array
        (
            [0] => pes
            [1] => evropa
            [2] => druha
        )

    [2] => Array
        (
            [0] => pes
            [1] => tramtarie
            [2] => prvni
        )

    [3] => Array
        (
            [0] => pes
            [1] => tramtarie
            [2] => druha
        )

    [4] => Array
        (
            [0] => kocka
            [1] => evropa
            [2] => prvni
        )

    [5] => Array
        (
            [0] => kocka
            [1] => evropa
            [2] => druha
        )

    [6] => Array
        (
            [0] => kocka
            [1] => tramtarie
            [2] => prvni
        )

    [7] => Array
        (
            [0] => kocka
            [1] => tramtarie
            [2] => druha
        )

    [8] => Array
        (
            [0] => godzilla
            [1] => evropa
            [2] => prvni
        )

    [9] => Array
        (
            [0] => godzilla
            [1] => evropa
            [2] => druha
        )

    [10] => Array
        (
            [0] => godzilla
            [1] => tramtarie
            [2] => prvni
        )

    [11] => Array
        (
            [0] => godzilla
            [1] => tramtarie
            [2] => druha
        )

)


Mělo by to být ok — 3*2*2 je 12 a funkce skutečně vrátí pole s 12ti kombinacemi.
Keeehi
Profil
$podminka = true;
$a = $b = $c = 0;
$vystup = array();
$pole = array(
    array('pes', 'kocka', 'godzilla'),
    array('evropa', 'tramtarie'),
    array('prvni', 'druha'),
);

while($podminka){
  $vystup[] = array($pole[0][$a], $pole[1][$b], $pole[2][$c]);
  $c++;
  
  if($c == count($pole[2])){
      $c = 0;
      $b++;
  }
  
  if($b == count($pole[1])){
      $b = 0;
      $a++;
  }
  
  if($a == count($pole[0])){
      $podminka = false;
  }
}

print_r($vystup);
ShiraNai7
Profil
Keeehi:
Akorát tam máš natvrdo naprogramovány procedury jen pro 3 pole. Má funkce je obecná, vezme libovolný počet polí s libovolným počtem řetězců v nich.
Keeehi
Profil
ShiraNai7:
no tak já to tedy přepracuji :)
EDIT: a nebo ne, je to zbytečné.
ShiraNai7
Profil
Keeehi:
EDIT: a nebo ne, je to zbytečné.

Je, když už jsem přesně takovou napsal :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0