Search code examples
phpspiral

PHP Spiral with numbers 0 to 9


I am searching for someone who could write me a script to output the following pattern:

http://img84.imageshack.us/img84/3038/82351644.png

its starting with 0 in the center, then 1 to the left, 2 down, 3 right...you get the idea. - its always 0 to 9 and starting over again...

i found this topic , but it is clearly different from my request. since i have no good understanding of php and the "pros" are here, i am asking nicely if someone would spend some time doing this for me. That would be great! Also if I could set in a variable how many "rounds" the script is performing, that would be awesome! - Thanks a lot


Solution

  • Just because I had nothing better to do and I always like a challenge:

    <?php
    
    // A few constants.
    define('DOWN', 0);
    define('LEFT', 3);
    define('RIGHT', 1);
    define('UP', 2);
    
    // Dictates the size of the spiral.
    $size = 11;
    
    // The initial number.
    $number = 0;
    
    // The initial direction.
    $direction = RIGHT;
    
    // The distance and number of points remaining before switching direction.
    $remain = $distance = 1;
    
    // The initial "x" and "y" point.
    $y = $x = round($size / 2);
    
    // The dimension of the spiral.
    $dimension = $size * $size;
    
    // Loop
    for ( $count = 0; $count < $dimension; $count++ )
    {
      // Add the current number to the "x" and "y" coordinates.
      $spiral[$x][$y] = $number;
    
      // Depending on the direction, set the "x" or "y" value.
      switch ( $direction )
      {
        case LEFT: $y--; break;
        case UP: $x--; break;
        case DOWN: $x++; break;
        case RIGHT: $y++; break;
      }
    
      // If the distance remaining is "0", switch direction.
      if ( --$remain == 0 )
      {
        switch ( $direction )
        {
          case DOWN:
            $direction = LEFT;
            $distance++;
    
            break;
          case UP:
            $distance++;
    
          default:
            $direction--;
    
            break;
        }
    
        // Reset the distance remaining.
        $remain = $distance;
      }
    
      // Increment the number or reset it to 0 if the number is 9.
      if ( $number < 9 )
        $number++;
      else
        $number = 0;
    }
    
    // Sort by "x" numerically.
    ksort($spiral, SORT_NUMERIC);
    
    foreach ( $spiral as &$x )
    {
      // Sort by "y" numerically.
      ksort($x, SORT_NUMERIC);
    
      foreach ( $x as $ykey => $y )
        // Output the number.
        echo $y . ' ';
    
      // Skip a line.
      echo PHP_EOL;
    }
    

    Outputs:

    0 1 2 3 4 5 6 7 8 9 0 
    9 2 3 4 5 6 7 8 9 0 1 
    8 1 2 3 4 5 6 7 8 9 2 
    7 0 1 0 1 2 3 4 5 0 3 
    6 9 0 9 6 7 8 9 6 1 4 
    5 8 9 8 5 0 1 0 7 2 5 
    4 7 8 7 4 3 2 1 8 3 6 
    3 6 7 6 5 4 3 2 9 4 7 
    2 5 6 5 4 3 2 1 0 5 8 
    1 4 3 2 1 0 9 8 7 6 9 
    0 9 8 7 6 5 4 3 2 1 0