PHP – Nest a for цикл переменное количество раз

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

Я хочу сделать динамическое изменение количества вложенных циклов в соответствии с переменной $dicenumber . Прямо сейчас он может обрабатывать только 3 кости, поскольку код:

  for ($d1=1; $d1 <= $d1value ; $d1++) { for ($d2=1; $d2 <= $d2value ; $d2++) { for ($d3=1; $d3 <= $d3value ; $d3++) { array_push(${sum.($d1+$d2+$d3)}, "$d1"."$d2"."$d3"); } } } 

Но я хочу изменить его так, чтобы, например, если $dicenumber составлял 2 , это $dicenumber бы что-то вроде:

  for ($d1=1; $d1 <= $d1value ; $d1++) { for ($d2=1; $d2 <= $d2value ; $d2++) { array_push(${sum.($d1+$d2)}, "$d1"."$d2"); } } 

Я хочу, чтобы код обрабатывался для любого числа $dicenumber , без ограничений. Оглядываясь, кажется, что мне нужно добавить какой-то рекурсивный код, но я не знаю, как это сделать. Какие-нибудь советы? Кроме того, любая обратная связь о том, что я сделал неправильно в целом, была бы чрезвычайно полезна! благодаря!

  <?php //defines the number and type of dice $dicenumber = 3; $dtype = 6; //defines the maximum value of every die for ($i=1; $i <=$dicenumber ; $i++) { ${d.$i.value} = $dtype; } //defines and array for each possible sum resulting from the roll of the given number of dice. for ($i=$dicenumber; $i <= ($dtype*$dicenumber) ; $i++) { ${sum.$i} = array(); } //the troublesome piece of code I want to change for ($d1=1; $d1 <= $d1value ; $d1++) { for ($d2=1; $d2 <= $d2value ; $d2++) { for ($d3=1; $d3 <= $d3value ; $d3++) { array_push(${sum.($d1+$d2+$d3)}, "$d1"."$d2"."$d3"); } } } //prints all the possible roll combinations, each line lists combination that share the same sum for ($i=$dicenumber; $i <= ($dtype*$dicenumber); $i++) { print join(" ", ${sum.$i})."<br />"; } ?> 

Solutions Collecting From Web of "PHP – Nest a for цикл переменное количество раз"

Здесь мы имеем двухфункциональный процесс. Первая функция buildArrays создает массивы в правильном формате для подачи во вторую функцию allCombinations . Итак, для этого примера с 3 d6 в игре buildArrays создаст эквивалентный ему массив:

 $data = array( array(1, 2, 3, 4, 5, 6), array(1, 2, 3, 4, 5, 6), array(1, 2, 3, 4, 5, 6)); 

Я предупреждаю вас, что, увеличивая количество костей и количество сторон, количество возможных комбинаций увеличивается экспоненциально! Это означает, что вы можете разместить очень большой спрос на сервере, и как тайм-аут, так и максимальные пределы памяти быстро вступят в игру. Генерируемые массивы могут быть очень, очень большими и быстро потреблять больше максимального предела памяти. Тем не менее, здесь мы идем:

 function buildArrays($dicenumber, $dtype){ for ($i = 0; $i<$dicenumber; $i++){ $tmp = array(); for ($j = 1; $j<=$dtype; $j++){ $tmp[] = $j; } $data[$i] = $tmp; } return $data; } function allCombinations($data){ $result = array(array()); //this is crucial, dark magic. foreach ($data as $key => $array) { $new_result = array(); foreach ($result as $old_element){ foreach ($array as $element){ if ($key == 0){ $new_result[] = $element; } else { $new_result[] = $old_element.$element; } } $result = $new_result; } } return $result; } //set variables $dicenumber = 3; $dtype = 6; //set_time_limit(0); //You may need to uncomment this for large values. //call functions $data = buildArrays($dicenumber, $dtype); $results = allCombinations($data); //print out the results foreach ($results as $result){ echo $result."<br/>"; } 

NB Этот ответ является вариантом декартового кода продукта

Если вы изучили функции, вы можете сделать рекурсивный вызов и следить за тем, что вы используете, а затем увеличивать его каждый вызов функции (и заканчивать цикл, как только вы набрали ваш #). понимание базовой рекурсии