items as $BasketItem) { if($BasketItem->hasItem($item)) { $BasketItem->setCount($BasketItem->getCount() + $count); return; } } if($count == 0) { $this->set($item); } else { $this->set($item, $count); } } public function getSumPrice() { $result = 0; foreach($this->items as $BasketItem) { $result += $BasketItem->getItem()->getPrice() * $BasketItem->getCount(); $result += $BasketItem->getItem()->getExtraPrice(); } return $result; } public function hasItems() { return ($this->count() > 0); } public function remove($item) { foreach($this->items as $key => $BasketItem) { if($BasketItem->hasItem($item)) { unset($this->items[$key]); return; } } } public function removeAll() { $this->items = array(); } public function set($item, $count = 1) { if($count == 0) { $this->remove($item); return; } foreach($this->items as $BasketItem) { if($BasketItem->hasItem($item)) { $BasketItem->setCount($count); return; } } $this->items[] = new BasketItem($item, $count); } /* Iterator */ public function current() { if(($BasketItem = current($this->items)) === false) { return false; } else { return $BasketItem->getItem(); } } public function key() { if(($key = key($this->items)) === false) { return false; } else { return $this->items[$key]->getCount(); } } public function next() { if(($BasketItem = next($this->items)) === false) { return false; } else { return $BasketItem->getItem(); } } public function rewind() { reset($this->items); } public function valid() { return $this->current() !== false; } /* Countable */ public function count() { return count($this->items); } } class BasketItem { protected $item; protected $count; public function __construct($item, $count = 1) { $this->item = $item; $this->count = $count; } public function increaseCount() { $this->count++; } public function decreaseCount() { $this->count--; } public function getCount() { return $this->count; } public function setCount($count) { $this->count = $count; } public function getItem() { return $this->item; } public function setItem($item) { $this->item = $item; } public function hasItem($item) { return ($this->getItem()->__toString() == $item->__toString()); } } ?>