Я нашел эту функцию, когда искал самый быстрый способ найти все возможные перестановки числового массива.
private function permute(array $elements)
{
if (count($elements) <= 1) {
yield $elements;
} else {
foreach ($this->permute(array_slice($elements, 1)) as $permutation) {
foreach (range(0, count($elements) - 1) as $i) {
yield array_merge(
array_slice($permutation, 0, $i),
[$elements[0]],
array_slice($permutation, $i)
);
}
}
}
}
Что мне нужно, это перемешать его результаты и получить случайные N перестановок числового массива.
Проблема в том, что он возвращает объект, и невозможно перемешать его результат.
Любые предложения?
Какие-либо предложения
Этот метод возвращает экземпляр Класс генератора. И это предсказуемо, так как он использует yield
вместо return
, Вы можете зациклить этот объект с foreach
или, в вашем случае вы, можете получить весь массив перестановок с iterator_to_array
(это возможно, потому что генератор реализует Проходной интерфейс).
$permutations = iterator_to_array(permute($array));
shuffle($permutations);
$result = array_slice($permutations, 0, 3);
Вот рабочая демо.
Ты можешь читать больше о генераторах.
Других решений пока нет …