Спасибо
dimonchik2013 за подсказанный алгоритм. Кому надо, вот моё решение на php:
$a = ['a1','a2','a3'];
$b = ['b1'];
$c = ['c1','c2'];
$d = ['d1','d2','d3','d4'];
$total = [];
for ($i = 0; $i <= count($a); $i++) {
for ($j = 0; $j <= count($b); $j++) {
for ($k = 0; $k <= count($c); $k++) {
for ($l = 0; $l <= count($d); $l++) {
$r = array($a[$i], $b[$j], $c[$k], $d[$l]); // варианты в массив
$r = array_filter($r); // удаляем пустые варианты
$r = implode(' ', $r); // массив значений в строку
array_push($total, $r); // и эту строку в итоговый массив
}
}
}
}
$total= array_filter($total);
asort($total); // сортировка массива по алфавиту
// выведем результат
echo '<pre>';
print_r($total);
echo '<br>Всего результатов: '.count($total);
echo '</pre>';