2017-03-22 3 views
0

ich PHP-Code, der wie folgt aussieht:Kann nicht function() mit Rekursion innerhalb for-Schleife neu deklarieren

function generate_sections() { 
    $puzzle = []; 

    // sections 
    for ($i = 0; $i < 9; $i++) { 
     // cells 
     function generate_cells() { 
      $section = []; 

      for ($i = 0; $i < 9; $i++) { 
       $random_number = rand(1, 9); 

       if (!in_array($random_number, $section)) { 
        array_push($section, $random_number); 
       } else { 
        return generate_cells(); 
       } 
      } 
     } 

     array_push($puzzle, $section); 
    } 

    return $puzzle; 
} 

var_dump(generate_sections()); 

Die zweite for-Schleife hat eindeutige Zahlen erzeugen und sie zu den Abschnitten [] Array hinzufügen. Dies funktioniert gut, wenn ich die zweite Schleife aus der ersten Schleife nehme. Wenn es jedoch wie dies schreibt, der generate_cells() Funktion nicht wieder auftritt, ist es mir die folgende Störung gibt:

Fatal error: Cannot redeclare generate_cells() (previously declared in /Applications/AMPPS/www/sudoku/index.php:38) in /Applications/AMPPS/www/sudoku/index.php on line 37 
+5

Es ist, weil Sie versuchen, generate_cells neu zu deklarieren, müssen Sie außerhalb von generate_sections diese Funktion setzen, dann rufen Sie einfach generate_cells INSIDE generate_sections – clearshot66

+2

Die Fehlermeldung ist selbsterklärend . Der Code deklariert die Funktion immer wieder in einer Schleife. Eine einzige Erklärung ist genug und eine zweite ist nicht erlaubt. – axiac

+0

@ clearshot66 Ich sehe. Aber das Seltsame ist, dass ich gerade eine Funktion gemacht habe, die nicht innerhalb einer Schleife war, und innerhalb dieser Funktion konnte ich mich selbst mit 'return function_name()' aufrufen. Warum kann ich in diesem Fall die Funktion nicht in sich ausführen? Ich brauche die Rekursion innerhalb dieser else-Anweisung, sonst ist die Logik weg. –

Antwort

2

Du declareting Funktion „generate_cells“ in Schleife. Bei der Ausführung der zweiten Schleife, wenn die Funktion bereits deklariert ist, erhalten Sie einen schwerwiegenden Fehler.
Es ist muss so sein:

function generate_sections() 
{ 
    $puzzle = []; 

    // sections 
    for ($i = 0; $i < 9; $i++) { 
     // cells 
     $section = generate_cells(); 

     array_push($puzzle, $section); 
    } 
    return $puzzle; 
} 

function generate_cells() 
{ 
    $section = []; 

    for ($i = 0; $i < 9; $i++) { 
     $random_number = rand(1, 9); 

     if (!in_array($random_number, $section)) { 
      array_push($section, $random_number); 
     } else { 
      return generate_cells(); 
     } 
    } 

    return $section; 
} 

var_dump(generate_sections()); 
+0

Danke, das funktioniert perfekt :) –

Verwandte Themen