Комбинирование элементов из нескольких массивов

Papas

Новичок
Товарищи, камрады, поможите ибо туплю. Вообщем, код ниже делает прямо то, что мне нужно, за 1 исключением - кол-во вложенных массивов может быть произвольным, а не строго 3 как в примере.
PHP:
$a = array( // кол-во вложенных массивов произвольное
        array('a0', 'a1', 'a2'), // нужно каждый элемент этого массива скомбинировать с каждым элементом нижеследующих массивов
        array('b0', 'b1'),
        array('c0', 'c1', 'c2', 'c3')
);
$variants = array();
foreach ($a[0] as $var) {
    foreach ($a[1] as $var2) {
        foreach ($a[2] as $var3) {
            $variants[] = array($var, $var2, $var3);
        }
    }
}
echo '<pre>';
var_dump($variants);
Как сделать тоже самое, но при условии произвольного количества массивов?
 

Papas

Новичок
ну я в курсе рекурсии. даже могу рекурсивно дерево папок/файлов сформировать) но как решить данную задачу - никак не пойму
 

Тугай

Новичок
PHP:
$a = array(
	array('пьет', 'курит'),
	array('мужчина', 'женщина'),
	array('русый', 'брюнет', 'блондин', 'шотен'),
	array('козрог', 'рыба', 'дева')
);

$Na = count($a);
for($s=0; $s < $Na; $s++) {
	$i[$s] = 0;
	$n[$s] = count($a[$s]);
}
$v= array();
$done=false;
do {
	$e = array(); 
	for($s=0; $s < $Na; ++$s) {
	  $e[] = $a[$s][$i[$s]];
	}
	$v[] = $e;
	for($s=$Na-1; $s>=0; --$s) {
		$i[$s]++;
		if ($i[$s] >= $n[$s] && $s == 0) {
			$done = true;
		}
		if ($i[$s] >= $n[$s]) {
			$i[$s] = 0;
		} else {
			break;
		}
	}
} while (!$done);

print_r($v);
 

Papas

Новичок
PHP:
$a = array(
	array('пьет', 'курит'),
	array('мужчина', 'женщина'),
	array('русый', 'брюнет', 'блондин', 'шотен'),
	array('козрог', 'рыба', 'дева')
);

$Na = count($a);
for($s=0; $s < $Na; $s++) {
	$i[$s] = 0;
	$n[$s] = count($a[$s]);
}
$v= array();
$done=false;
do {
	$e = array(); 
	for($s=0; $s < $Na; ++$s) {
	  $e[] = $a[$s][$i[$s]];
	}
	$v[] = $e;
	for($s=$Na-1; $s>=0; --$s) {
		$i[$s]++;
		if ($i[$s] >= $n[$s] && $s == 0) {
			$done = true;
		}
		if ($i[$s] >= $n[$s]) {
			$i[$s] = 0;
		} else {
			break;
		}
	}
} while (!$done);

print_r($v);
да ты Бог программирования!!!
 

WMix

герр M:)ller
Партнер клуба
PHP:
function permr($a){
    $what = array_shift($a);
    if(count($a)>1) $with = r($a);
    else $with = current($a);
    foreach($what as $what_val){
        foreach($with as $with_val){
            if( is_array($with_val) ){
                array_unshift($with_val,$what_val);
                $permr[] = $with_val;
            }else{
                $permr[] = array($what_val,$with_val);
            }
        }
    }
    return $permr;
}
 
Сверху