Как я могу получить все перестановки в PHP без последовательных дубликатов?

Этот вопрос задавался во многих формах. Я хочу взять массив в PHP и получить все возможные комбинации / перестановки. Я хочу как перестановки всего набора, так и частичный набор.

Мой поворот в этом вопросе спрашивает, как я могу удалить последовательные дубликаты из элементов результата. Я был близок к тому, что хотел, используя « PHP принять все комбинации » и добавив функцию:

$words = array('a','b','c'); function permutations($arr,$n) { $res = array(); foreach ($arr as $w) { if ($n==1) $res[] = $w; else { $perms = permutations($arr,$n-1); foreach ($perms as $p) { $res[] = $w." ".$p; } } } return $res; } function get_all_permutations($words=array()) { $r = array(); for($i=sizeof($words);$i>0;$i--) { $r = array_merge(permutations($words,$i),$r); } return $r; } $permutations = get_all_permutations($words); print_r($permutations); 

Это будет выводить:

 Array ( [0] => a [1] => b [2] => c [3] => aa [4] => ab [5] => ac [6] => ba [7] => bb [8] => bc [9] => ca [10] => cb [11] => cc [12] => aaa [13] => aab [14] => aac [15] => aba [16] => abb [17] => abc [18] => aca [19] => acb [20] => acc [21] => baa [22] => bab [23] => bac [24] => bba [25] => bbb [26] => bbc [27] => bca [28] => bcb [29] => bcc [30] => caa [31] => cab [32] => cac [33] => cba [34] => cbb [35] => cbc [36] => cca [37] => ccb [38] => ccc ) 

Я знаю, что я мог просматривать результат после создания набора, но можно ли удалить последовательные дубликаты во время генерации?

Примеры, которые следует преобразовать / удалить:

  • ccc будет таким же, как c
  • ccb будет таким же, как cb
  • ccccc также будет таким же, как c (если набор был больше)

Заметки:

  • Я не очень хорош с рекурсией, но, вероятно, есть фантастический способ объединить две функции, которые у меня есть, в одну.
  • Прямо сейчас наборы выходных данных являются строками, но я не против, если они являются массивами вместо этого (если это упрощает задачу)

Related of "Как я могу получить все перестановки в PHP без последовательных дубликатов?"

Вы можете передать массив перестановок в качестве ссылки (с продолжением амперсанда) в качестве третьего параметра перестановок () и запустить проверку in_array () перед добавлением значения. Однако это было бы гораздо менее результативным, чем удаление дубликатов в конце get_all_permutation ()