Как получить все возможные варианты «соединения» строк из 4 или более массивов?
число перестановок - n факториал
т.е.  count  = len(a)*len(b)*len(c)*..*len(x)
алгоритм - банальный for  по вложенным массивам a = ['a1','a2','a3',]
b = ['b1',]
c = ['c1','c2',]
d = ['d1','d2','d3','d4',]


total = []
for i in range(0, len(a)):
    for j in range(0, len(b)):
        for k in range(0, len(c)):
            for l in range(0, len(d)):
                total.append(a[i]+b[j]+c[k]+d[l])

print(total)
print(len(total))
Спасибо 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>';