<?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()); 
    } 
} 
 
 |