/** * Return all possibility for the matrix * * @return array */ public function compute() { $dimensions = $this->dimensions; if (empty($dimensions)) { return array(); } // Pop first dimension $values = reset($dimensions); $name = key($dimensions); unset($dimensions[$name]); // Create all possiblites for the first dimension $posibilities = array(); foreach ($values as $v) { $posibilities[] = array($name => $v); } // If only one dimension return simple all the possibilites created (break point of recursivity) if (empty($dimensions)) { return $posibilities; } // If not create a new matrix with remaining dimension $matrix = new Matrix(); foreach ($dimensions as $name => $values) { $matrix->setDimension($name, $values); } $result = $matrix->compute(); $newResult = array(); foreach ($result as $value) { foreach ($posibilities as $possiblity) { $newResult[] = $value + $possiblity; } } return $newResult; }
public function testCompute() { $matrix = new Matrix(); $matrix->setDimension('a', array(1, 2, 3)); $matrix->setDimension('b', array(1, 2, 3)); $matrix->setDimension('c', array(1, 2, 3)); $possibilities = $matrix->compute(); $expected = array(array('a' => 1, 'b' => 1, 'c' => 1), array('a' => 1, 'b' => 1, 'c' => 2), array('a' => 1, 'b' => 1, 'c' => 3), array('a' => 1, 'b' => 2, 'c' => 1), array('a' => 1, 'b' => 2, 'c' => 2), array('a' => 1, 'b' => 2, 'c' => 3), array('a' => 1, 'b' => 3, 'c' => 1), array('a' => 1, 'b' => 3, 'c' => 2), array('a' => 1, 'b' => 3, 'c' => 3), array('a' => 2, 'b' => 1, 'c' => 1), array('a' => 2, 'b' => 1, 'c' => 2), array('a' => 2, 'b' => 1, 'c' => 3), array('a' => 2, 'b' => 2, 'c' => 1), array('a' => 2, 'b' => 2, 'c' => 2), array('a' => 2, 'b' => 2, 'c' => 3), array('a' => 2, 'b' => 3, 'c' => 1), array('a' => 2, 'b' => 3, 'c' => 2), array('a' => 2, 'b' => 3, 'c' => 3), array('a' => 3, 'b' => 1, 'c' => 1), array('a' => 3, 'b' => 1, 'c' => 2), array('a' => 3, 'b' => 1, 'c' => 3), array('a' => 3, 'b' => 2, 'c' => 1), array('a' => 3, 'b' => 2, 'c' => 2), array('a' => 3, 'b' => 2, 'c' => 3), array('a' => 3, 'b' => 3, 'c' => 1), array('a' => 3, 'b' => 3, 'c' => 2), array('a' => 3, 'b' => 3, 'c' => 3)); $this->assertCount(count($expected), $possibilities); foreach ($expected as $value) { $this->assertContains($value, $possibilities); } }