Этот вопрос задавался во многих формах. Я хочу взять массив в 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
(если набор был больше) Заметки:
Вы можете передать массив перестановок в качестве ссылки (с продолжением амперсанда) в качестве третьего параметра перестановок () и запустить проверку in_array () перед добавлением значения. Однако это было бы гораздо менее результативным, чем удаление дубликатов в конце get_all_permutation ()