Например дано ['a', 'b']
(как генератор) и 2 как длина
функция выдаст генератор, который даст:
'',
'a',
'b',
'ab'
'ba'
'aa'
'bb'
или дано ['a']
и длиной 3:
'',
'a',
'aa',
'aaa',
Как вы можете себе представить, этот набор станет намного больше, если будет добавлено больше букв или увеличена длина, в нем должны быть перечислены все перестановки данных символов вплоть до длины
Вот довольно понятное решение.
//Returns all permuations of a certain length.
function perm($ls, $len)
{
if($len <= 0)
yield '';
else
foreach ($ls as $x)
foreach(perm($ls, $len-1) as $i)
yield $x.$i;
}
//Returns all permuations of all lengths less or equal to the supplied integer.
function all_perm($ls, $len) {
//$ls = iterator_to_array($ls);
for($x=$len; $x>=0; $x--)
foreach(perm($ls, $len-$x) as $string)
yield $string;
}
Просто позвони all_perm с вашим массивом и максимальной длиной. Если аргумент обязательно должен быть генератором, раскомментируйте $ ls = iterator_to_array ($ ls);.
Других решений пока нет …