Во первых, загоните входные данные в двумерный массив, или список массивов или что там вообще в php есть, чтобы можно было взять первый, второй и т.д. входной массив по номеру или перейти к следующему.
Далее, как вы уже знаете, нужна рекурсивная функция. Передаевайте ей уже собранную часть ответа и какой из массивов надо использовать следующим (итератор в списке или номер в массиве).
Функция берет из текущего массива один из элементов в цикле и добавляет его к ответу и запускается рукурсивно от следующего массива. Еще функция не берет ничего из текущего массива и запускается рекурсивно.
Надо вставить следующие проверки: Если функция запущена от после-последнего массива, то надо вывести текущий ответ. Цикл по элементам текущего массива пропускается, если в ответе уже максимально возможное количество элементов.
Рекурсивный вызов без добавления элемента пропускается, если оставшихся дальше массивов столько же, сколько не хватает элементов в текущем ответе до минимально нужного размера.
Псевдокод примерно такой (не php, чтобы не позориться):
function Generate(result, array_index, arrays) {
if(result >= len(arrays)) {
print(result)
return
}
if (min_length - len(result) < len(arrays)-array_index-1) {
Generate(answer, array_index+1, arrays);
}
if (len(answer) < max_length) {
for i = 0...len(arrays[array_index]) {
answer.push_back(arrays[array_index][i]);
Generate(answer, array_index+1, arrays);
answer.pop_back();
}
}
}