| 
<?php
 class Collection implements Countable, IteratorAggregate
 {
 protected $items = [];
 
 public function __construct($items = [])
 {
 $this->items = $items;
 }
 
 public function __toString()
 {
 return $this->toJson();
 }
 
 public function all()
 {
 return $this->items;
 }
 
 public function first()
 {
 return isset($this->items[0]) ? $this->items[0] : [];
 }
 
 public function last()
 {
 $results = array_reverse($this->items);
 return isset($results[0]) ? $results[0] : [];
 }
 
 public function count()
 {
 return count($this->items);
 }
 
 public function each($callback)
 {
 foreach($this->items as $key => $value)
 {
 $callback($value, $key);
 }
 
 return $this;
 }
 
 public function filter($callback = null)
 {
 if($callback)
 {
 return new static(array_filter($this->items, $callback));
 }
 
 return new static(array_filter($this->items));
 }
 
 public function map($callback)
 {
 $keys = array_keys($this->items);
 
 $items = array_map($callback, $this->items, $keys);
 
 return new static(array_combine($keys, $items));
 }
 
 public function toJson()
 {
 return json_encode($this->items);
 }
 
 public function getIterator()
 {
 return new ArrayIterator($this->items);
 }
 }
 |