<?php namespace FluentForm\Framework\Support; use Closure; use FluentForm\Framework\Support\Arr; use FluentForm\Framework\Support\Collection; class Helper { /** * Create a collection from the given value. * * @param mixed $value * @return \FluentForm\Framework\Support\Collection */ public static function collect($value = null) { return new Collection($value); } /** * Fill in data where it's missing. * * @param mixed $target * @param string|array $key * @param mixed $value * @return mixed */ function dataFill(&$target, $key, $value) { return static::dataSet($target, $key, $value, false); } /** * Get an item from an array or object using "dot" notation. * * @param mixed $target * @param string|array|int|null $key * @param mixed $default * @return mixed */ public static function dataGet($target, $key, $default = null) { if (is_null($key)) { return $target; } $key = is_array($key) ? $key : explode('.', $key); while (($segment = array_shift($key)) !== null) { if ($segment === '*') { if ($target instanceof Collection) { $target = $target->all(); } elseif (! is_array($target)) { return static::value($default); } $result = Arr::pluck($target, $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 static::value($default); } } return $target; } /** * Set an item on an array or object using dot notation. * * @param mixed $target * @param string|array $key * @param mixed $value * @param bool $overwrite * @return mixed */ public static function dataSet(&$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) { static::dataSet($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] = []; } static::dataSet($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} = []; } static::dataSet($target->{$segment}, $segments, $value, $overwrite); } elseif ($overwrite || ! isset($target->{$segment})) { $target->{$segment} = $value; } } else { $target = []; if ($segments) { static::dataSet($target[$segment], $segments, $value, $overwrite); } elseif ($overwrite) { $target[$segment] = $value; } } return $target; } /** * Get the first element of an array. Useful for method chaining. * * @param array $array * @return mixed */ public static function head($array) { return reset($array); } /** * Get the last element from an array. * * @param array $array * @return mixed */ public static function last($array) { return end($array); } /** * Return the default value of the given value. * * @param mixed $value * @return mixed */ public static function value($value, ...$args) { return $value instanceof Closure ? $value(...$args) : $value; } }