| | <?php |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | namespace think; |
| |
|
| | use ArrayAccess; |
| | use ArrayIterator; |
| | use Countable; |
| | use IteratorAggregate; |
| | use JsonSerializable; |
| |
|
| | class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable |
| | { |
| | |
| | |
| | |
| | protected $items = []; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function __construct($items = []) |
| | { |
| | $this->items = $this->convertToArray($items); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public static function make($items = []) |
| | { |
| | return new static($items); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function isEmpty() |
| | { |
| | return empty($this->items); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function toArray() |
| | { |
| | return array_map(function ($value) { |
| | return ($value instanceof Model || $value instanceof self) ? |
| | $value->toArray() : |
| | $value; |
| | }, $this->items); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function all() |
| | { |
| | return $this->items; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function flip() |
| | { |
| | return new static(array_flip($this->items)); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function keys() |
| | { |
| | return new static(array_keys($this->items)); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function values() |
| | { |
| | return new static(array_values($this->items)); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function merge($items) |
| | { |
| | return new static(array_merge($this->items, $this->convertToArray($items))); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function diff($items) |
| | { |
| | return new static(array_diff($this->items, $this->convertToArray($items))); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function intersect($items) |
| | { |
| | return new static(array_intersect($this->items, $this->convertToArray($items))); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function pop() |
| | { |
| | return array_pop($this->items); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function shift() |
| | { |
| | return array_shift($this->items); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function unshift($value, $key = null) |
| | { |
| | if (is_null($key)) { |
| | array_unshift($this->items, $value); |
| | } else { |
| | $this->items = [$key => $value] + $this->items; |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function push($value, $key = null) |
| | { |
| | if (is_null($key)) { |
| | $this->items[] = $value; |
| | } else { |
| | $this->items[$key] = $value; |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function reduce(callable $callback, $initial = null) |
| | { |
| | return array_reduce($this->items, $callback, $initial); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function reverse() |
| | { |
| | return new static(array_reverse($this->items)); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function chunk($size, $preserveKeys = false) |
| | { |
| | $chunks = []; |
| |
|
| | foreach (array_chunk($this->items, $size, $preserveKeys) as $chunk) { |
| | $chunks[] = new static($chunk); |
| | } |
| |
|
| | return new static($chunks); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function each(callable $callback) |
| | { |
| | foreach ($this->items as $key => $item) { |
| | $result = $callback($item, $key); |
| |
|
| | if (false === $result) { |
| | break; |
| | } |
| |
|
| | if (!is_object($item)) { |
| | $this->items[$key] = $result; |
| | } |
| | } |
| |
|
| | return $this; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function filter(callable $callback = null) |
| | { |
| | return new static(array_filter($this->items, $callback ?: null)); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function column($columnKey, $indexKey = null) |
| | { |
| | if (function_exists('array_column')) { |
| | return array_column($this->items, $columnKey, $indexKey); |
| | } |
| |
|
| | $result = []; |
| | foreach ($this->items as $row) { |
| | $key = $value = null; |
| | $keySet = $valueSet = false; |
| |
|
| | if (null !== $indexKey && array_key_exists($indexKey, $row)) { |
| | $key = (string) $row[$indexKey]; |
| | $keySet = true; |
| | } |
| |
|
| | if (null === $columnKey) { |
| | $valueSet = true; |
| | $value = $row; |
| | } elseif (is_array($row) && array_key_exists($columnKey, $row)) { |
| | $valueSet = true; |
| | $value = $row[$columnKey]; |
| | } |
| |
|
| | if ($valueSet) { |
| | if ($keySet) { |
| | $result[$key] = $value; |
| | } else { |
| | $result[] = $value; |
| | } |
| | } |
| | } |
| |
|
| | return $result; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function sort(callable $callback = null) |
| | { |
| | $items = $this->items; |
| | $callback = $callback ?: function ($a, $b) { |
| | return $a == $b ? 0 : (($a < $b) ? -1 : 1); |
| | }; |
| |
|
| | uasort($items, $callback); |
| | return new static($items); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function shuffle() |
| | { |
| | $items = $this->items; |
| |
|
| | shuffle($items); |
| | return new static($items); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function slice($offset, $length = null, $preserveKeys = false) |
| | { |
| | return new static(array_slice($this->items, $offset, $length, $preserveKeys)); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function offsetExists($offset) |
| | { |
| | return array_key_exists($offset, $this->items); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function offsetGet($offset) |
| | { |
| | return $this->items[$offset]; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | public function offsetSet($offset, $value) |
| | { |
| | if (is_null($offset)) { |
| | $this->items[] = $value; |
| | } else { |
| | $this->items[$offset] = $value; |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function offsetUnset($offset) |
| | { |
| | unset($this->items[$offset]); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function count() |
| | { |
| | return count($this->items); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function getIterator() |
| | { |
| | return new ArrayIterator($this->items); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function jsonSerialize() |
| | { |
| | return $this->toArray(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | public function toJson($options = JSON_UNESCAPED_UNICODE) |
| | { |
| | return json_encode($this->toArray(), $options); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | public function __toString() |
| | { |
| | return $this->toJson(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | protected function convertToArray($items) |
| | { |
| | return $items instanceof self ? $items->all() : (array) $items; |
| | } |
| | } |
| |
|