Допустим, есть массив
$params = [
'option1' => [1, 2, 3],
'option2' => [1, 2, 3, 4],
'option3' => [1, 2],
];
Элементов в массиве может быть любое кол-во.
Из этого массива нужно получить все варианты его перестановок (как ключей, так и значений).
Приведу пример того, что должно получится в итоге:
$result = [
[['option1','1'],],
[['option1','2'],],
[['option1','3'],],
[['option1','1'], ['option1','2'],],
[['option1','1'], ['option1','3'],],
[['option1','2'], ['option1','3'],],
[['option1','1'], ['option1','2'], ['option1','3']],
[['option2', 1],],
[['option2', 2],],
[['option2', 3],],
[['option2', 4],],
[['option2', 1], ['option2', 2],],
[['option2', 1], ['option2', 3],],
[['option2', 1], ['option2', 4],],
[['option2', 2], ['option2', 2],],
[['option2', 2], ['option2', 3],],
[['option2', 2], ['option2', 4],],
[['option2', 3], ['option2', 3],],
[['option2', 3], ['option2', 4],],
[['option2', 4], ['option2', 4],],
[['option2', 1], ['option2', 2], ['option2', 3],],
[['option2', 1], ['option2', 2], ['option2', 4],],
[['option2', 1], ['option2', 3], ['option2', 4],],
[['option2', 1], ['option2', 2], ['option2', 3], ['option2', 4]],
[['option3','1'],],
[['option3','2'],],
[['option3','1'], ['option3','2'],],
// а теперь самое интересное
[['option1','1'], ['option2', 1],],
[['option1','1'], ['option2', 2],],
[['option1','1'], ['option2', 3],],
[['option1','1'], ['option2', 4],],
[['option1','1'], ['option2', 1], ['option2', 2],],
// ...
[['option1','1'], ['option1','2'], ['option2', 1],],
// ...
[['option1','1'], ['option2', 1], ['option3','1'],],
// .. и т д
];
Подскажите алгоритм или принцип, никак не могу понять, как вообще написать эту рекурсию)
В идеале это все должно быть максимально оптимально. Если можно сделать так, что бы функция мне каждый раз возвращала бы следующие N элементов последовательности - было бы оптимальнее всего.