blob: 8fa87a2b37573dfcfbf98f9a8c32c4b295c1fe65 [file] [log] [blame]
<?php
namespace LdapRecord\Support;
use ArrayAccess;
class Arr
{
/**
* Determine whether the given value is array accessible.
*
* @param mixed $value
*
* @return bool
*/
public static function accessible($value)
{
return is_array($value) || $value instanceof ArrayAccess;
}
/**
* Determine if the given key exists in the provided array.
*
* @param \ArrayAccess|array $array
* @param string|int $key
*
* @return bool
*/
public static function exists($array, $key)
{
if ($array instanceof ArrayAccess) {
return $array->offsetExists($key);
}
return array_key_exists($key, $array);
}
/**
* If the given value is not an array and not null, wrap it in one.
*
* @param mixed $value
*
* @return array
*/
public static function wrap($value)
{
if (is_null($value)) {
return [];
}
return is_array($value) ? $value : [$value];
}
/**
* Return the first element in an array passing a given truth test.
*
* @param iterable $array
* @param callable|null $callback
* @param mixed $default
*
* @return mixed
*/
public static function first($array, callable $callback = null, $default = null)
{
if (is_null($callback)) {
if (empty($array)) {
return Helpers::value($default);
}
foreach ($array as $item) {
return $item;
}
}
foreach ($array as $key => $value) {
if ($callback($value, $key)) {
return $value;
}
}
return Helpers::value($default);
}
/**
* Return the last element in an array passing a given truth test.
*
* @param array $array
* @param callable|null $callback
* @param mixed $default
*
* @return mixed
*/
public static function last($array, callable $callback = null, $default = null)
{
if (is_null($callback)) {
return empty($array) ? Helpers::value($default) : end($array);
}
return static::first(array_reverse($array, true), $callback, $default);
}
/**
* Get an item from an array using "dot" notation.
*
* @param ArrayAccess|array $array
* @param string|int|null $key
* @param mixed $default
*
* @return mixed
*/
public static function get($array, $key, $default = null)
{
if (! static::accessible($array)) {
return Helpers::value($default);
}
if (is_null($key)) {
return $array;
}
if (static::exists($array, $key)) {
return $array[$key];
}
if (strpos($key, '.') === false) {
return $array[$key] ?? Helpers::value($default);
}
foreach (explode('.', $key) as $segment) {
if (static::accessible($array) && static::exists($array, $segment)) {
$array = $array[$segment];
} else {
return Helpers::value($default);
}
}
return $array;
}
}