* @version $Id$ */ class ArrayDividingTest extends PHPUnit_Framework_TestCase { /** * @dataProvider dataProvider */ public function testDividingAlgorithm( array $input, array $expected ) { $this->assertEquals( $this->transformation( $input[0] ), $expected[0] ); } public function dataProvider() { return array( // First run array( array( array( 'a', 'b', 'c', ) ), array( array( array( 'a', 'b', 'c', ) ) ), ), // Second run array( array( array( 'a', 'b', 'c', 'd', 'e', 'f', 'g', ) ), array( array( array( 'a', 'd', 'f' ), array( 'b', 'e', 'g' ), array( 'c', '', '' ) ) ), ), // Third run array( array( array( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', ) ), array( array( array( 'a', 'e', 'i', ), array( 'b', 'f', 'j', ), array( 'c', 'g', 'k', ), array( 'd', 'h', 'l', ) ) ), ), // Fourth run array( array( array( 'a', 'b', ) ), array( array( array( 'a', 'b', '', ), ) ), ), // Fifth run array( array( array( 'a', ) ), array( array( array( 'a', '', '', ), ) ), ), // Sixth run array( array( array( 'a', 'b', 'c', 'd', 'e', ) ), array( array( array( 'a', 'c', 'e', ), array( 'b', 'd', '', ), ) ), ), // Seventh run array( array( array( 'a', 'b', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l' ) ), array( array( array( 'a', 'f', 'j', ), array( 'b', 'g', 'k', ), array( 'd', 'h', 'l', ), array( 'e', 'i', '', ), ) ), ), // Eighth run array( array( array( 'a', 'b', 'g', 'h', ) ), array( array( array( 'a', 'g', 'h', ), array( 'b', '', '', ), ) ), ), // Nine run array( array( array( 'a', 'b', 'c', 'd', 'e', 'f', ) ), array( array( array( 'a', 'c', 'e', ), array( 'b', 'd', 'f', ), ) ), ), ); } /** * @param array $toTransform * @param int $columnsMax * @return array */ private function transformation( array $toTransform, $columnsMax = 3 ) { // First divide array as you need $listlen = count( $toTransform ); $partlen = floor( $listlen / $columnsMax ); $partrem = $listlen % $columnsMax; $partition = array(); $mark = 0; for ( $px = 0; $px < $columnsMax; $px++ ) { $incr = ( $px < $partrem ) ? $partlen + 1 : $partlen; $partition[ $px ] = array_slice( $toTransform, $mark, $incr ); $mark += $incr; } // Secondly fill empty slots for easy template use $result = array(); for ( $i = 0; $i < count( $partition[0] ); $i++ ) { $tmp = array(); foreach ( $partition as $column ) { if ( isset( $column[ $i ] ) ) { $tmp[] = $column[ $i ]; } else { $tmp[] = ''; } } $result[] = $tmp; } return $result; } }