Возможный дубликат:
алгоритм, который будет принимать числа или слова и находить все возможные комбинации
Если у меня есть массив, такой как:
array('a', 'b', 'c', 'd');
Как создать новый массив со всеми возможными комбинациями из этих 4 значений, таких как
aaaa, aaab, aaac, aaad ... dddb, dddc, dddd
Благодаря!
Вот еще один способ.
Эта функция увеличивается в базе ([количество элементов в массиве])
и использует функцию strtr для замены символов для строк.
function everyCombination($array) { $arrayCount = count($array); $maxCombinations = pow($arrayCount, $arrayCount); $returnArray = array(); $conversionArray = array(); if ($arrayCount >= 2 && $arrayCount <= 36) { foreach ($array as $key => $value) { $conversionArray[base_convert($key, 10, $arrayCount)] = $value; } for ($i = 0; $i < $maxCombinations; $i++) { $combination = base_convert($i, 10, $arrayCount); $combination = str_pad($combination, $arrayCount, "0", STR_PAD_LEFT); $returnArray[] = strtr($combination, $conversionArray); } return $returnArray; } echo 'Input array must have between 2 and 36 elements'; }
Затем …
print_r(everyCombination(array('a', 'b', 'c', 'd')));
Это также кажется значительно быстрее, чем приведенный ниже рекурсивный пример.
Используя microtime () на моем сервере, этот код работает в 0.072862863540649 секунд
Ниже приведен рекурсивный пример: 0.39673089981079 секунд.
На 138% быстрее!
Вы должны использовать рекурсивную функцию
function perm($arr, $n, $result = array()) { if($n <= 0) return false; $i = 0; $new_result = array(); foreach($arr as $r) { if(count($result) > 0) { foreach($result as $res) { $new_element = array_merge($res, array($r)); $new_result[] = $new_element; } } else { $new_result[] = array($r); } } if($n == 1) return $new_result; return perm($arr, $n - 1, $new_result); } $array = array('a', 'b', 'c', 'd'); $permutations = perm($array, 4); print_r($permutations);