netjunky

Untitled

Oct 25th, 2011
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.14 KB | None | 0 0
  1. <?php
  2. /**
  3.  * @author  Eugene Serkin <jserkin@gmail.com>
  4.  * @version $Id$
  5.  */
  6.  
  7. class ArrayDividingTest extends PHPUnit_Framework_TestCase
  8. {
  9.     /**
  10.      * @dataProvider dataProvider
  11.      */
  12.     public function testDividingAlgorithm( array $input, array $expected )
  13.     {
  14.         $this->assertEquals( $this->transformation( $input[0] ), $expected[0] );
  15.     }
  16.  
  17.     public function dataProvider()
  18.     {
  19.         return array(
  20.             // First run
  21.             array(
  22.                 array(
  23.                     array( 'a', 'b', 'c', )
  24.                 ),
  25.                 array(
  26.                     array(
  27.                         array( 'a', 'b', 'c', )
  28.                     )
  29.                 ),
  30.             ),
  31.             // Second run
  32.             array(
  33.                 array(
  34.                     array( 'a', 'b', 'c', 'd', 'e', 'f', 'g', )
  35.                 ),
  36.                 array(
  37.                     array(
  38.                         array( 'a', 'd', 'f' ),
  39.                         array( 'b', 'e', 'g' ),
  40.                         array( 'c', '', '' )
  41.                     )
  42.                 ),
  43.             ),
  44.             // Third run
  45.             array(
  46.                 array(
  47.                     array(
  48.                         'a', 'b', 'c', 'd',
  49.                         'e', 'f', 'g', 'h',
  50.                         'i', 'j', 'k', 'l',
  51.                     )
  52.                 ),
  53.                 array(
  54.                     array(
  55.                         array( 'a', 'e', 'i', ),
  56.                         array( 'b', 'f', 'j', ),
  57.                         array( 'c', 'g', 'k', ),
  58.                         array( 'd', 'h', 'l', )
  59.                     )
  60.                 ),
  61.             ),
  62.             // Fourth run
  63.             array(
  64.                 array(
  65.                     array(
  66.                         'a', 'b',
  67.                     )
  68.                 ),
  69.                 array(
  70.                     array(
  71.                         array( 'a', 'b', '', ),
  72.                     )
  73.                 ),
  74.             ),
  75.             // Fifth run
  76.             array(
  77.                 array(
  78.                     array(
  79.                         'a',
  80.                     )
  81.                 ),
  82.                 array(
  83.                     array(
  84.                         array( 'a', '', '', ),
  85.                     )
  86.                 ),
  87.             ),
  88.             // Sixth run
  89.             array(
  90.                 array(
  91.                     array(
  92.                         'a', 'b', 'c',
  93.                         'd', 'e',
  94.                     )
  95.                 ),
  96.                 array(
  97.                     array(
  98.                         array( 'a', 'c', 'e', ),
  99.                         array( 'b', 'd', '', ),
  100.                     )
  101.                 ),
  102.             ),
  103.             // Seventh run
  104.             array(
  105.                 array(
  106.                     array(
  107.                         'a', 'b', 'd', 'e', 'f',
  108.                         'g', 'h', 'i', 'j', 'k', 'l'
  109.                     )
  110.                 ),
  111.                 array(
  112.                     array(
  113.                         array( 'a', 'f', 'j', ),
  114.                         array( 'b', 'g', 'k', ),
  115.                         array( 'd', 'h', 'l', ),
  116.                         array( 'e', 'i', '', ),
  117.                     )
  118.                 ),
  119.             ),
  120.             // Eighth run
  121.             array(
  122.                 array(
  123.                     array(
  124.                         'a', 'b', 'g', 'h',
  125.                     )
  126.                 ),
  127.                 array(
  128.                     array(
  129.                         array( 'a', 'g', 'h', ),
  130.                         array( 'b', '', '', ),
  131.                     )
  132.                 ),
  133.             ),
  134.             // Nine run
  135.             array(
  136.                 array(
  137.                     array(
  138.                         'a', 'b', 'c', 'd', 'e', 'f',
  139.                     )
  140.                 ),
  141.                 array(
  142.                     array(
  143.                         array( 'a', 'c', 'e', ),
  144.                         array( 'b', 'd', 'f', ),
  145.                     )
  146.                 ),
  147.             ),
  148.         );
  149.     }
  150.  
  151.     /**
  152.      * @param array $toTransform
  153.      * @param int $columnsMax
  154.      * @return array
  155.      */
  156.     private function transformation( array $toTransform, $columnsMax = 3 )
  157.     {
  158.         // First divide array as you need
  159.         $listlen   = count( $toTransform );
  160.         $partlen   = floor( $listlen / $columnsMax );
  161.         $partrem   = $listlen % $columnsMax;
  162.         $partition = array();
  163.         $mark      = 0;
  164.  
  165.         for ( $px = 0; $px < $columnsMax; $px++ )
  166.         {
  167.             $incr             = ( $px < $partrem ) ? $partlen + 1 : $partlen;
  168.             $partition[ $px ] = array_slice( $toTransform, $mark, $incr );
  169.             $mark             += $incr;
  170.         }
  171.  
  172.         // Secondly fill empty slots for easy template use
  173.         $result = array();
  174.  
  175.         for ( $i = 0; $i < count( $partition[0] ); $i++ )
  176.         {
  177.             $tmp = array();
  178.  
  179.             foreach ( $partition as $column )
  180.             {
  181.                 if ( isset( $column[ $i ] ) )
  182.                 {
  183.                     $tmp[] = $column[ $i ];
  184.                 }
  185.                 else
  186.                 {
  187.                     $tmp[] = '';
  188.                 }
  189.             }
  190.  
  191.             $result[] = $tmp;
  192.         }
  193.  
  194.         return $result;
  195.     }
  196. }
Add Comment
Please, Sign In to add comment