xref: /plugin/oauthgeneric/DotAccess.php (revision 420dfed28d253914c75cca0384d8d36b8f5a226b)
1cf22df2fSAndreas Gohr<?php
2cf22df2fSAndreas Gohr
3cf22df2fSAndreas Gohrnamespace dokuwiki\plugin\oauthgeneric;
4cf22df2fSAndreas Gohr
5cf22df2fSAndreas Gohr/**
6cf22df2fSAndreas Gohr * Dot notation access to arrays
7cf22df2fSAndreas Gohr *
8cf22df2fSAndreas Gohr * @see https://stackoverflow.com/a/39118759/172068
9cf22df2fSAndreas Gohr */
10cf22df2fSAndreas Gohrclass DotAccess
11cf22df2fSAndreas Gohr{
12cf22df2fSAndreas Gohr
13cf22df2fSAndreas Gohr    /**
14cf22df2fSAndreas Gohr     * Get an item from an array using "dot" notation.
15cf22df2fSAndreas Gohr     *
16cf22df2fSAndreas Gohr     * @param \ArrayAccess|array $array
17cf22df2fSAndreas Gohr     * @param string $key
18cf22df2fSAndreas Gohr     * @param mixed $default
19cf22df2fSAndreas Gohr     * @return mixed
20cf22df2fSAndreas Gohr     */
21cf22df2fSAndreas Gohr    public static function get($array, $key, $default = null)
22cf22df2fSAndreas Gohr    {
23*420dfed2SAndreas Gohr        $key = trim($key, '.');
24*420dfed2SAndreas Gohr
25cf22df2fSAndreas Gohr        if (!static::accessible($array)) {
26cf22df2fSAndreas Gohr            return $default;
27cf22df2fSAndreas Gohr        }
28cf22df2fSAndreas Gohr        if (is_null($key)) {
29cf22df2fSAndreas Gohr            return $array;
30cf22df2fSAndreas Gohr        }
31cf22df2fSAndreas Gohr        if (static::exists($array, $key)) {
32cf22df2fSAndreas Gohr            return $array[$key];
33cf22df2fSAndreas Gohr        }
34cf22df2fSAndreas Gohr        if (strpos($key, '.') === false) {
35cf22df2fSAndreas Gohr            return $array[$key] ?? $default;
36cf22df2fSAndreas Gohr        }
37cf22df2fSAndreas Gohr        foreach (explode('.', $key) as $segment) {
38cf22df2fSAndreas Gohr            if (static::accessible($array) && static::exists($array, $segment)) {
39cf22df2fSAndreas Gohr                $array = $array[$segment];
40cf22df2fSAndreas Gohr            } else {
41cf22df2fSAndreas Gohr                return $default;
42cf22df2fSAndreas Gohr            }
43cf22df2fSAndreas Gohr        }
44cf22df2fSAndreas Gohr        return $array;
45cf22df2fSAndreas Gohr    }
46cf22df2fSAndreas Gohr
47cf22df2fSAndreas Gohr    /**
48cf22df2fSAndreas Gohr     * Determine whether the given value is array accessible.
49cf22df2fSAndreas Gohr     *
50cf22df2fSAndreas Gohr     * @param mixed $value
51cf22df2fSAndreas Gohr     * @return bool
52cf22df2fSAndreas Gohr     */
53cf22df2fSAndreas Gohr    protected static function accessible($value)
54cf22df2fSAndreas Gohr    {
55cf22df2fSAndreas Gohr        return is_array($value) || $value instanceof \ArrayAccess;
56cf22df2fSAndreas Gohr    }
57cf22df2fSAndreas Gohr
58cf22df2fSAndreas Gohr    /**
59cf22df2fSAndreas Gohr     * Determine if the given key exists in the provided array.
60cf22df2fSAndreas Gohr     *
61cf22df2fSAndreas Gohr     * @param \ArrayAccess|array $array
62cf22df2fSAndreas Gohr     * @param string|int $key
63cf22df2fSAndreas Gohr     * @return bool
64cf22df2fSAndreas Gohr     */
65cf22df2fSAndreas Gohr    protected static function exists($array, $key)
66cf22df2fSAndreas Gohr    {
67cf22df2fSAndreas Gohr        if ($array instanceof \ArrayAccess) {
68cf22df2fSAndreas Gohr            return $array->offsetExists($key);
69cf22df2fSAndreas Gohr        }
70cf22df2fSAndreas Gohr        return array_key_exists($key, $array);
71cf22df2fSAndreas Gohr    }
72cf22df2fSAndreas Gohr}
73