Пример #1
0
 public function testAbbreviation()
 {
     $unit = new Unit('Kilogram', 'kg');
     $this->assertEquals('kg', $unit->getAbbr());
     $unit = new Unit('Kilogram', '..kilo gram ');
     $this->assertEquals('kilogram', $unit->getAbbr());
     $unit = new Unit('Kilogram', '1kg');
     $this->assertEquals('kg', $unit->getAbbr());
 }
Пример #2
0
 /**
  * Convert over a number of hops if possible
  *
  * Breadth-first search from http://www.sitepoint.com/data-structures-4/
  *
  * @return SplDoublyLinkedList|array
  */
 protected function getIndirectConversion(Unit $from, Unit $to)
 {
     $origin = $from->getAbbr();
     $destination = $to->getAbbr();
     // Mark all nodes as unvisited
     $visited = array();
     foreach ($this->conversions as $vertex => $adj) {
         $visited[$vertex] = false;
     }
     // Create a queue
     $q = new \SplQueue();
     // Enqueue the origin vertex and mark as visited
     $q->enqueue($origin);
     $visited[$origin] = true;
     // Create a path that can be back-tracked
     $path = array();
     $path[$origin] = new \SplDoublyLinkedList();
     $path[$origin]->setIteratorMode(\SplDoublyLinkedList::IT_MODE_FIFO | \SplDoublyLinkedList::IT_MODE_KEEP);
     $found = false;
     while (!$q->isEmpty() && $q->bottom() != $destination) {
         $t = $q->dequeue();
         if (!empty($this->conversions[$t])) {
             // For each adjacent neighbour,
             foreach ($this->conversions[$t] as $vertex => $conv) {
                 if (!array_key_exists($vertex, $visited) || !$visited[$vertex]) {
                     // Mark as visited and enqueue
                     $q->enqueue($vertex);
                     $visited[$vertex] = true;
                     // Add to current path
                     $path[$vertex] = clone $path[$t];
                     $path[$vertex]->push($conv);
                 }
             }
         }
     }
     if (isset($path[$destination])) {
         return $path[$destination];
     } else {
         return array();
     }
 }