Создать комбинацию чисел

У меня есть страница PHP с двумя переменными: $nbRank и $nbNumeric . В зависимости от этих двух переменных я хочу сгенерировать массив, содержащий все существующие комбинации. Например:

Если $nbRank = 3 и $nbNumeric = 2 я бы:

 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0 2 1 1 0 1 1 1 1 1 2 1 2 0 1 2 1 1 2 2 2 0 0 2 0 1 2 0 2 2 1 0 2 1 1 2 1 2 2 2 0 2 2 1 2 2 2 

Итак, я создаю разные циклы и формулы, чтобы получить конечный результат, но он не работает. Это то, что я сделал:

 $result = array(); $nbIntRank = 0; $nbIntNumeric = 0; $nbRank = array(); $nbNumeric = array(); $nb_rangs = 3; $nb_chiffres = 2; for ($i = 1; $i <= $nb_rangs; $i++){ $nbRank[$i] = 0; } $nbIntRank = count($nbRank); for ($i = 0; $i <= $nb_chiffres; $i++){ $nbNumeric[$i] = $i; } $nbIntNumeric = count($nbNumeric); $algo = ($nb_rangs * ($nb_chiffres + 1)) * ($nb_rangs * ($nb_chiffres + 1)); $nbLine = $algo / ($nb_rangs); $occ = 0; for ($i = 0; $i < $nbLine; $i++){ foreach ($nbRank as $nbrItem => $nbrValue){ $result[$i][] = $nbrValue; $occ++; } } echo '#############<br />'; echo '### DATAS ###<br />'; echo '#############<br /><br />'; echo '- Nb Elements : '.$algo.'<br />'; echo '- Nb Lines : '.$nbLine.'<br />'; echo '- Nb Valuable Occurency : '.$occ.'<br />'; echo '<br /><hr /><br />'; echo '##############<br />'; echo '### PARSER ###<br />'; echo '##############<br /><br />'; echo '<pre>'; var_dump($result); echo '</pre>'; 

Мне удалось создать мой последний массив с пустыми значениями (81 значение, 27 строк из 3 элементов), но он содержит только 0.

Solutions Collecting From Web of "Создать комбинацию чисел"

Вот рекурсивное решение:

 $nbRank = 3; $nbNumeric = 2; function getCombinations ($length, $min, $max, $aStartingCombinations) { if ($length == 1) { return range ($min, $max); } $final = array (); foreach (getCombinations ($length - 1, $min, $max, $aStartingCombinations) as $combination) { for ($i = $min; $i <= $max; $i++) { $final [] = $combination . $i; } } return $final; } print_r (getCombinations ($nbRank, 0, $nbNumeric, array ())); 

Вы указали, что все будет в порядке с псевдокодом. К сожалению, я не могу предложить конкретную коррекцию для вашего php-кода [если эти ответы появляются – они могут быть более образовательными], но я выбрал рекурсивное решение для этой проблемы.

На каждом уровне рекурсии попробуйте все возможности и вызовите ту же функцию, чтобы найти все комбинации одного меньшего размера .

Псевдо-код:

 findCombinations(range,size,sol,resultList): if (size ==0): #base clause resultList.append(copy(sol)) #making a copy of sol and appending it as a solution return for each i in (0,range): sol.append(i) findCombinations(range,size-1,sol,resultList) #recursive invokation, with smaller size sol.deleteLast() #clean up environment before next calls 

Вызов с findCombinations(3,3,[],resultList) где [] – только пустой список, а resultList будет содержать список комбинаций при выполнении алгоритма. эта инволюция получит все комбинации размера 3 с элементами 0,1,2.

Замечание о сложности: количество возможностей растет экспоненциально [O (диапазон размеров )], поэтому, если вы попытаетесь вызвать его с помощью 20,20, например, для любого решения может потребоваться некоторое [очень большое] время.

 $nbRank = 3; $nbNumeric = 2; foreach (range(0, base_convert(str_pad('', $nbRank, $nbNumeric), $nbNumeric+1, 10)) as $i) { echo str_pad(base_convert($i, 10, $nbNumeric+1), 3, 0, STR_PAD_LEFT) . PHP_EOL; } 

Простая идея. То, что вы хотите, это каждое число от 0 до X с базовым $nbNumeric , поэтому мы просто конвертируем максимальное число в base 10, перебираем его с помощью обычных 10-ти операционных операторов и снова конвертируем его обратно в base $nbNumeric .

Вероятно, более читаемый, но на самом деле точно такой же

 $nbRank = 3; $nbNumeric = 2; // Top is "base_convert(222, 3, 10);" and therefore the upper limit $top = base_convert(str_pad('', $nbRank, $nbNumeric), $nbNumeric+1, 10); for ($i = 0; $i <= $top; $i++) { echo str_pad(base_convert($i, 10, $nbNumeric+1), 3, 0, STR_PAD_LEFT) . PHP_EOL; }