| 
<?php/**
 * *
 *  * please don't remove this comment block
 *  *
 *  * @author phptricks Team - Mohammad Anzawi
 *  * @author_uri https://phptricks.org
 *  * @uri https://github.com/anzawi/php-database-class
 *  * @version 5.0.0
 *  * @licence MIT -> https://opensource.org/licenses/MIT
 *  * @package PHPtricks\Orm
 *
 */
 
 namespace PHPtricks\Orm\Collection;
 
 use PHPtricks\Orm\Database;
 
 /**
 * Class Collection
 *
 * @package PHPtricks\Orm\Collection
 */
 class Collection extends Database
 {
 
 /**
 * Collection constructor.
 *
 * @param $data
 * @param  null  $connection
 */
 public function __construct($data, $connection = null)
 {
 if (isset($connection)) {
 $this->_table    = $data['table'];
 $this->_results  = $data['results'];
 $this->_idColumn = $data['id'];
 $this->_pdo      = $connection->_pdo;
 } else {
 if (is_array($data)) {
 $this->_results = isset($data['results']) ? $data['results']
 : $data;
 } else {
 $this->_results = $data;
 }
 }
 }
 
 /**
 * @return mixed|null
 */
 public function first()
 {
 return isset($this->_results[0]) ? $this->_results[0] : null;
 }
 
 /**
 * @param  int  $count
 *
 * @return array|mixed|null
 */
 public function last($count = 0)
 {
 $reverse = array_reverse($this->results());
 
 if ( ! $count) {
 return isset($reverse[0]) ? $reverse[0] : null;
 }
 
 $lastRecords = [];
 $j           = 0;
 
 for ($i = 0; $i < $count; $i++) {
 $lastRecords[$j] = $reverse[$i];
 $j++;
 }
 
 return $lastRecords;
 }
 
 /**
 * @param  callable  $callback
 *
 * @return $this
 */
 public function each(callable $callback)
 {
 foreach ($this->results() as $key => $value) {
 $callback($value, $key);
 }
 
 return $this;
 }
 
 /**
 * @param  callable|null  $callback
 *
 * @return $this
 */
 public function filter(callable $callback = null)
 {
 if ($callback) {
 return new static(array_filter($this->results(), $callback));
 }
 
 // exclude null and empty
 return new static(array_filter($this->results()));
 }
 
 /**
 * @param  callable  $callback
 *
 * @return $this
 */
 public function map(callable $callback)
 {
 $keys    = $this->keys()->all();
 $results = array_map($callback, $this->results(), $keys);
 
 return new static(array_combine($keys, $results));
 }
 
 /**
 * @return mixed
 */
 public function all()
 {
 return $this->results();
 }
 
 /**
 * @return $this
 */
 public function keys()
 {
 return new static(array_keys($this->results()));
 }
 
 /**
 * @return false|string
 */
 public function __toString()
 {
 return $this->toJson();
 }
 
 /**
 * @return false|string
 */
 public function toJson()
 {
 return json_encode($this->results());
 }
 
 
 /**
 * @return false|string
 */
 public function toJsonFormatted()
 {
 return '<pre>' . json_encode($this->results()) . '</pre>';
 }
 
 /**
 * @param $items
 *
 * @return $this
 */
 public function merge($items)
 {
 return new static(
 array_merge(
 $this->results(),
 $this->toArray($items)
 )
 );
 }
 
 /**
 * @param $items
 *
 * @return array|mixed
 */
 protected function toArray($items = null)
 {
 return (array)$items->all();
 }
 
 public function results()
 {
 return $this->_results;
 }
 
 public function count()
 {
 return count($this->results());
 }
 }
 
 |