2014-04-07 1 views
1

저는 PHP (및 프로그래밍 전반)의 초급자입니다. 지금까지 배운 것을 테스트하기 위해이 코드를 작성했습니다.이 코드는 설정된 수의 주사위와 특정 개수의 얼굴 수를 조합하여 인쇄합니다. (코드를 찾을 수 있습니다).PHP - for 루프를 가변 횟수만큼 중첩합니다.

내가하고 싶은 일은 $dicenumber 변수에 따라 중첩 된 for 루프의 수를 동적으로 변경하는 것입니다.

  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"); 
        } 
       } 
      } 

그러나 $dicenumber2이라면, 예를 들어,이 같은 생산 것이라고, 그래서 나는 그것을 변경하려면 : 지금 그것은 코드는 과정 3 주사위입니다 수 있기 때문에

  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 />"; 
     } 
     ?> 

답변

1

여기에는 두 가지 기능을 수행하는 프로세스가 있습니다. 첫 번째 함수 인 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/>"; 
} 

N.B. 이 답변은 변종입니다 the cartesian product code

+0

정말 고마워요 !! 당신은 이것이 나에게 얼마나 유익한 지 전혀 모른다. 이 코드는 조합을 차례대로 인쇄하는 반면, 원래의 코드는 sum으로 정렬 된 행에 인쇄했습니다. 행을 정렬하는 것을 포함하여 내가 원하는대로 출력을 조작 할 수 있기 때문에 프로세스가 명확하게 유연성이 있습니다. 다음에 시도 할 작업은 다음과 같습니다. 다시 한번 감사드립니다! 정말 고맙습니다. – user3507868

+0

문제 없습니다. 내 대답을 받아 들일 수 있다면, 좋을 것입니다 (체크 표시). – larsAnders

0

, 당신은 재귀 호출을하고 당신이있어 dicenumber 무엇을 추적 할 수 있습니다, 그것은에게 함수를 호출 할 때마다를 증가 (당신이 당신의 # 히트 일단 루프를 종료). understanding basic recursion

+0

답장을 보내 주셔서 감사합니다. 나는 사용자가 만든 함수에 대한 개념을 가지고있다. (예, CodeCademy에서 그 유닛을 만들었다.) 지난 몇 시간 동안 그 기능을 수행하고 있었지만, 추가 할 방법을 찾지 못해서 막혔다. array_push ($ {($ d1 + $ d2 + $ d3)}, "$ d1". "$ d2". "$ d3"); 동적으로 재귀 함수로 ... 어떤 제안? – user3507868