<?php
/**
* Part of the Collections package.
*
* NOTICE OF LICENSE
*
* Licensed under the 3-clause BSD License.
*
* This source file is subject to the 3-clause BSD License that is
* bundled with this package in the LICENSE file.
*
* @package Collections
* @version 1.1.0
* @author Cartalyst LLC
* @license BSD License (3-clause)
* @copyright (c) 2011-2015, Cartalyst LLC
* @link http://cartalyst.com
*/
namespace Cartalyst\Collections;
use Closure;
use Countable;
use ArrayAccess;
use ArrayIterator;
use JsonSerializable;
use IteratorAggregate;
class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable
{
/**
* The items contained in the collection.
*
* @var array
*/
protected $items = [];
/**
* Constructor.
*
* @param array $items
* @return void
*/
public function __construct(array $items = [])
{
$this->items = $items;
}
/**
* Create a new collection instance if the value isn't one already.
*
* @param array $items
* @return static
*/
public static function make(array $items = [])
{
return new static($items);
}
/**
* Get all of the items in the collection.
*
* @return array
*/
public function all()
{
return $this->items;
}
/**
* Count the number of items in the collection.
*
* @return int
*/
public function count()
{
return count($this->items);
}
/**
* Get the first item from the collection.
*
* @param \Closure $callback
* @param mixed $default
* @return mixed|null
*/
public function first(Closure $callback = null, $default = null)
{
return count($this->items) > 0 ? reset($this->items) : null;
}
/**
* Remove an item from the collection by key.
*
* @param mixed $key
* @return void
*/
public function forget($key)
{
$this->offsetUnset($key);
}
/**
* Get an item from the collection by key.
*
* @param mixed $key
* @param mixed $default
* @return mixed
*/
public function get($key, $default = null)
{
if ($this->offsetExists($key)) {
return $this->items[$key];
}
return $default;
}
/**
* Determine if an item exists in the collection by key.
*
* @param mixed $key
* @return bool
*/
public function has($key)
{
return $this->offsetExists($key);
}
/**
* Determine if the collection is empty or not.
*
* @return bool
*/
public function isEmpty()
{
return empty($this->items);
}
/**
* Get the last item from the collection.
*
* @return mixed|null
*/
public function last()
{
return count($this->items) > 0 ? end($this->items) : null;
}
/**
* Get an array with the values of a given key.
*
* @param string $value
* @return array
*/
public function lists($value)
{
return array_map(function ($item) use ($value) {
return isset($item[$value]) ? $item[$value] : null;
}, $this->items);
}
/**
* Get and remove the last item from the collection.
*
* @return mixed|null
*/
public function pop()
{
return array_pop($this->items);
}
/**
* Push an item onto the end of the collection.
*
* @param mixed $value
* @return void
*/
public function push($value)
{
$this->offsetSet(null, $value);
}
/**
* Pulls an item from the collection.
*
* @param mixed $key
* @param mixed $default
* @return mixed
*/
public function pull($key, $default = null)
{
$value = $this->offsetGet($key);
$this->offsetUnset($key);
return $value ?: $default;
}
/**
* Put an item in the collection by key.
*
* @param mixed $key
* @param mixed $value
* @return void
*/
public function put($key, $value)
{
$this->offsetSet($key, $value);
}
/**
* Get and remove the first item from the collection.
*
* @return mixed|null
*/
public function shift()
{
return array_shift($this->items);
}
/**
* Sort through each item with a callback.
*
* @param \Closure $callback
* @return $this
*/
public function sort(Closure $callback)
{
uasort($this->items, $callback);
return $this;
}
/**
* Sort the collection using the given Closure.
*
* @param \Closure|string $callback
* @param int $options
* @param bool $descending
* @return $this
*/
public function sortBy($callback, $options = SORT_REGULAR, $descending = false)
{
$results = [];
if (is_string($callback)) {
$callback = function ($item) use ($callback) {
foreach (explode('.', $callback) as $segment) {
if (is_array($item)) {
if ( ! array_key_exists($segment, $item)) {
return null;
}
$item = $item[$segment];
}
}
return $item;
};
}
// First we will loop through the items and get the comparator from a callback
// function which we were given. Then, we will sort the returned values and
// and grab the corresponding values for the sorted keys from this array.
foreach ($this->items as $key => $value) {
$results[$key] = $callback($value);
}
$descending ? arsort($results, $options) : asort($results, $options);
// Once we have sorted all of the keys in the array, we will loop through them
// and grab the corresponding model so we can set the underlying items list
// to the sorted version. Then we'll just return the collection instance.
foreach (array_keys($results) as $key) {
$results[$key] = $this->items[$key];
}
$this->items = $results;
return $this;
}
/**
* Sort the collection in descending order using the given Closure.
*
* @param \Closure|string $callback
* @param int $options
* @return $this
*/
public function sortByDesc($callback, $options = SORT_REGULAR)
{
return $this->sortBy($callback, $options, true);
}
/**
* Get the sum of the collection items.
*
* @param mixed $callback
* @return mixed
*/
public function sum($callback = null)
{
if (is_null($callback)) {
return array_sum($this->items);
}
return array_reduce($this->items, function ($result, $item) use ($callback) {
if (is_string($callback)) {
return $result += $item->{$callback}();
}
return $result += $callback($item);
}, 0);
}
/**
* Get the collection of items as a plain array.
*
* @return array
*/
public function toArray()
{
return array_map(function ($value) {
return $value instanceof Arrayable ? $value->toArray() : $value;
}, $this->items);
}
/**
* Convert the object into something JSON serializable.
*
* @return array
*/
public function jsonSerialize()
{
return $this->toArray();
}
/**
* Get the collection of items as JSON.
*
* @param int $options
* @return string
*/
public function toJson($options = 0)
{
return json_encode($this->toArray(), $options);
}
/**
* Get an iterator for the items.
*
* @return \ArrayIterator
*/
public function getIterator()
{
return new ArrayIterator($this->items);
}
/**
* Determine if an item exists at an offset.
*
* @param mixed $key
* @return bool
*/
public function offsetExists($key)
{
return array_key_exists($key, $this->items);
}
/**
* Get an item at a given offset.
*
* @param mixed $key
* @return mixed
*/
public function offsetGet($key)
{
return $this->items[$key];
}
/**
* Set the item at a given offset.
*
* @param mixed $key
* @param mixed $value
* @return void
*/
public function offsetSet($key, $value)
{
if (is_null($key)) {
$this->items[] = $value;
} else {
$this->items[$key] = $value;
}
}
/**
* Unset the item at a given offset.
*
* @param string $key
* @return void
*/
public function offsetUnset($key)
{
unset($this->items[$key]);
}
/**
* Dynamically retrieve the value of an item.
*
* @param string $key
* @return mixed
*/
public function __get($key)
{
return $this->get($key);
}
/**
* Dynamically set the value of an item.
*
* @param string $key
* @param mixed $value
* @return void
*/
public function __set($key, $value)
{
$this->items[$key] = $value;
}
/**
* Dynamically check if an item is set.
*
* @param string $key
* @return void
*/
public function __isset($key)
{
return isset($this->items[$key]);
}
/**
* Convert the collection to its string representation.
*
* @return string
*/
public function __toString()
{
return $this->toJson();
}
/**
* Dynamically unset an item.
*
* @param string $key
* @return void
*/
public function __unset($key)
{
unset($this->items[$key]);
}
}
Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]