Вариант с построением массива:
$words = array(
array('бесплатен', 'бесплатен', 'бесплатна', 'бесплатная', 'бесплатно', 'бесплатного', 'бесплатное', 'бесплатной', 'бесплатном', 'бесплатному', 'бесплатною', 'бесплатную', 'бесплатны', 'бесплатные', 'бесплатным', 'бесплатными', 'бесплатных'),
array('подарка', 'подаркам', 'подарками', 'подарках', 'подарке', 'подарки', 'подарков', 'подарком', 'подарку'),
array('в', 'на'),
array('москве', 'москвой', 'москвою', 'москву', 'москвы')
);
function vars($w, $i) {
$res = array();
if ($i == count($w) - 1) {
$res = $w[$i];
} else {
$variants = vars($w, $i+1);
foreach ($w[$i] as $v) {
foreach ($variants as $va) {
array_push($res, $v.' '.$va);
}
}
}
return $res;
}
$res = vars($words, 0);
foreach ($res as $v) {
echo($v.'<br>');
}
Вариант без построения массива:
$words = array(
array('бесплатен', 'бесплатен', 'бесплатна', 'бесплатная', 'бесплатно', 'бесплатного', 'бесплатное', 'бесплатной', 'бесплатном', 'бесплатному', 'бесплатною', 'бесплатную', 'бесплатны', 'бесплатные', 'бесплатным', 'бесплатными', 'бесплатных'),
array('подарка', 'подаркам', 'подарками', 'подарках', 'подарке', 'подарки', 'подарков', 'подарком', 'подарку'),
array('в', 'на'),
array('москве', 'москвой', 'москвою', 'москву', 'москвы')
);
function vars(&$w, $i=0, $s='') {
if ($i == count($w)) {
echo($s.'<br>');
} else {
foreach ($w[$i] as $v) {
vars($w, $i+1, $s.' '.$v);
}
}
}
vars($words);