123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- <?php
- declare(strict_types=1);
- /**
- * This file is part of Hyperf.
- *
- * @link https://www.hyperf.io
- * @document https://hyperf.wiki
- * @contact group@hyperf.io
- * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
- */
- namespace Hyperf\Collection;
- use Closure;
- /**
- * Create a collection from the given value.
- *
- * @template TKey of array-key
- * @template TValue
- *
- * @param null|\Hyperf\Contract\Arrayable<TKey, TValue>|iterable<TKey, TValue> $value
- * @return Collection<TKey, TValue>
- */
- function collect($value = []): Collection
- {
- return new Collection($value);
- }
- /**
- * Fill in data where it's missing.
- *
- * @param mixed $target
- * @param array|string $key
- * @param mixed $value
- * @return mixed
- */
- function data_fill(&$target, $key, $value)
- {
- return data_set($target, $key, $value, false);
- }
- /**
- * Get an item from an array or object using "dot" notation.
- *
- * @param mixed $target
- * @param null|array|int|string $key
- * @param mixed $default
- * @return mixed
- */
- function data_get($target, $key, $default = null)
- {
- if (is_null($key)) {
- return $target;
- }
- $key = is_array($key) ? $key : explode('.', $key);
- foreach ($key as $i => $segment) {
- unset($key[$i]);
- if (is_null($segment)) {
- return $target;
- }
- if ($segment === '*') {
- if ($target instanceof Collection) {
- $target = $target->all();
- } elseif (! is_iterable($target)) {
- return value($default);
- }
- $result = [];
- foreach ($target as $item) {
- $result[] = data_get($item, $key);
- }
- return in_array('*', $key) ? Arr::collapse($result) : $result;
- }
- if (Arr::accessible($target) && Arr::exists($target, $segment)) {
- $target = $target[$segment];
- } elseif (is_object($target) && isset($target->{$segment})) {
- $target = $target->{$segment};
- } else {
- return value($default);
- }
- }
- return $target;
- }
- /**
- * Set an item on an array or object using dot notation.
- *
- * @param mixed $target
- * @param array|string $key
- * @param mixed $value
- * @param bool $overwrite
- * @return mixed
- */
- function data_set(&$target, $key, $value, $overwrite = true)
- {
- $segments = is_array($key) ? $key : explode('.', $key);
- if (($segment = array_shift($segments)) === '*') {
- if (! Arr::accessible($target)) {
- $target = [];
- }
- if ($segments) {
- foreach ($target as &$inner) {
- data_set($inner, $segments, $value, $overwrite);
- }
- } elseif ($overwrite) {
- foreach ($target as &$inner) {
- $inner = $value;
- }
- }
- } elseif (Arr::accessible($target)) {
- if ($segments) {
- if (! Arr::exists($target, $segment)) {
- $target[$segment] = [];
- }
- data_set($target[$segment], $segments, $value, $overwrite);
- } elseif ($overwrite || ! Arr::exists($target, $segment)) {
- $target[$segment] = $value;
- }
- } elseif (is_object($target)) {
- if ($segments) {
- if (! isset($target->{$segment})) {
- $target->{$segment} = [];
- }
- data_set($target->{$segment}, $segments, $value, $overwrite);
- } elseif ($overwrite || ! isset($target->{$segment})) {
- $target->{$segment} = $value;
- }
- } else {
- $target = [];
- if ($segments) {
- /* @phpstan-ignore-next-line */
- data_set($target[$segment], $segments, $value, $overwrite);
- } elseif ($overwrite) {
- $target[$segment] = $value;
- }
- }
- return $target;
- }
- if (! function_exists('data_forget')) {
- /**
- * Remove / unset an item from an array or object using "dot" notation.
- *
- * @param mixed $target
- * @param null|array|int|string $key
- * @return mixed
- */
- function data_forget(&$target, $key)
- {
- $segments = is_array($key) ? $key : explode('.', $key);
- if (($segment = array_shift($segments)) === '*' && Arr::accessible($target)) {
- if ($segments) {
- foreach ($target as &$inner) {
- data_forget($inner, $segments);
- }
- }
- } elseif (Arr::accessible($target)) {
- if ($segments && Arr::exists($target, $segment)) {
- data_forget($target[$segment], $segments);
- } else {
- Arr::forget($target, $segment);
- }
- } elseif (is_object($target)) {
- if ($segments && isset($target->{$segment})) {
- data_forget($target->{$segment}, $segments);
- } elseif (isset($target->{$segment})) {
- unset($target->{$segment});
- }
- }
- return $target;
- }
- }
- /**
- * Get the first element of an array. Useful for method chaining.
- *
- * @param array $array
- * @return mixed
- */
- function head($array)
- {
- return reset($array);
- }
- /**
- * Get the last element from an array.
- *
- * @param array $array
- * @return mixed
- */
- function last($array)
- {
- return end($array);
- }
- /**
- * Return the default value of the given value.
- *
- * @param mixed ...$args
- * @return mixed
- */
- function value(mixed $value, ...$args)
- {
- return $value instanceof Closure ? $value(...$args) : $value;
- }
|