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