xref: /plugin/combo/ComboStrap/ArrayCaseInsensitive.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
1*37748cd8SNickeau<?php
2*37748cd8SNickeau
3*37748cd8SNickeau
4*37748cd8SNickeaunamespace ComboStrap;
5*37748cd8SNickeau
6*37748cd8SNickeau
7*37748cd8SNickeauuse ArrayAccess;
8*37748cd8SNickeauuse ArrayObject;
9*37748cd8SNickeauuse Traversable;
10*37748cd8SNickeau
11*37748cd8SNickeau/**
12*37748cd8SNickeau * Class ArrayCaseInsensitive
13*37748cd8SNickeau * @package ComboStrap
14*37748cd8SNickeau *
15*37748cd8SNickeau * Wrapper around an array to make it case access insensitive
16*37748cd8SNickeau */
17*37748cd8SNickeauclass ArrayCaseInsensitive implements ArrayAccess, \Iterator
18*37748cd8SNickeau{
19*37748cd8SNickeau
20*37748cd8SNickeau    /**
21*37748cd8SNickeau     * A mapping between lower key and original key (ie offset)
22*37748cd8SNickeau     * @var array
23*37748cd8SNickeau     */
24*37748cd8SNickeau    private $_keyMapping = array();
25*37748cd8SNickeau    /**
26*37748cd8SNickeau     * @var array
27*37748cd8SNickeau     */
28*37748cd8SNickeau    private $sourceArray;
29*37748cd8SNickeau    /**
30*37748cd8SNickeau     * @var false|mixed
31*37748cd8SNickeau     */
32*37748cd8SNickeau    private $valid;
33*37748cd8SNickeau    private $iteratorIndex = 0;
34*37748cd8SNickeau    /**
35*37748cd8SNickeau     * @var \ArrayIterator
36*37748cd8SNickeau     */
37*37748cd8SNickeau    private $iterator;
38*37748cd8SNickeau
39*37748cd8SNickeau
40*37748cd8SNickeau    public function __construct(array &$source = array())
41*37748cd8SNickeau    {
42*37748cd8SNickeau        $this->sourceArray = &$source;
43*37748cd8SNickeau        array_walk($source, function ($value, &$key) {
44*37748cd8SNickeau            $this->_keyMapping[strtolower($key)] = $key;
45*37748cd8SNickeau        });
46*37748cd8SNickeau
47*37748cd8SNickeau        /**
48*37748cd8SNickeau         * Iterator
49*37748cd8SNickeau         */
50*37748cd8SNickeau        $this->rewind();
51*37748cd8SNickeau    }
52*37748cd8SNickeau
53*37748cd8SNickeau    public function offsetSet($offset, $value)
54*37748cd8SNickeau    {
55*37748cd8SNickeau
56*37748cd8SNickeau        if (is_null($offset)) {
57*37748cd8SNickeau            LogUtility::msg("The offset (key) is null and this is not supported");
58*37748cd8SNickeau        } else {
59*37748cd8SNickeau            if (is_string($offset)) {
60*37748cd8SNickeau                $lowerCaseOffset = strtolower($offset);
61*37748cd8SNickeau                $this->_keyMapping[$lowerCaseOffset] = $offset;
62*37748cd8SNickeau                $this->sourceArray[$offset] = $value;
63*37748cd8SNickeau            } else {
64*37748cd8SNickeau                LogUtility::msg("The offset should be a string", LogUtility::LVL_MSG_ERROR);
65*37748cd8SNickeau            }
66*37748cd8SNickeau
67*37748cd8SNickeau        }
68*37748cd8SNickeau    }
69*37748cd8SNickeau
70*37748cd8SNickeau    public function offsetExists($offset)
71*37748cd8SNickeau    {
72*37748cd8SNickeau        if (is_string($offset)) $offset = strtolower($offset);
73*37748cd8SNickeau        return isset($this->_keyMapping[$offset]);
74*37748cd8SNickeau    }
75*37748cd8SNickeau
76*37748cd8SNickeau    public function offsetUnset($offset)
77*37748cd8SNickeau    {
78*37748cd8SNickeau        if (is_string($offset)) $offset = strtolower($offset);
79*37748cd8SNickeau        $originalOffset = $this->_keyMapping[$offset];
80*37748cd8SNickeau        unset($this->sourceArray[$originalOffset]);
81*37748cd8SNickeau        unset($this->_keyMapping[$offset]);
82*37748cd8SNickeau
83*37748cd8SNickeau    }
84*37748cd8SNickeau
85*37748cd8SNickeau    public function offsetGet($offset)
86*37748cd8SNickeau    {
87*37748cd8SNickeau        if (is_string($offset)) $offset = strtolower($offset);
88*37748cd8SNickeau        $sourceOffset = $this->_keyMapping[$offset];
89*37748cd8SNickeau        return isset($this->sourceArray[$sourceOffset])
90*37748cd8SNickeau            ? $this->sourceArray[$sourceOffset]
91*37748cd8SNickeau            : null;
92*37748cd8SNickeau    }
93*37748cd8SNickeau
94*37748cd8SNickeau    function getOriginalArray()
95*37748cd8SNickeau    {
96*37748cd8SNickeau        return $this->sourceArray;
97*37748cd8SNickeau    }
98*37748cd8SNickeau
99*37748cd8SNickeau
100*37748cd8SNickeau    public function current()
101*37748cd8SNickeau    {
102*37748cd8SNickeau        return $this->iterator->current();
103*37748cd8SNickeau    }
104*37748cd8SNickeau
105*37748cd8SNickeau    public function next()
106*37748cd8SNickeau    {
107*37748cd8SNickeau        $this->iterator->next();
108*37748cd8SNickeau    }
109*37748cd8SNickeau
110*37748cd8SNickeau    public function key()
111*37748cd8SNickeau    {
112*37748cd8SNickeau        return $this->iterator->key();
113*37748cd8SNickeau    }
114*37748cd8SNickeau
115*37748cd8SNickeau    public function valid()
116*37748cd8SNickeau    {
117*37748cd8SNickeau        return $this->iterator->valid();
118*37748cd8SNickeau    }
119*37748cd8SNickeau
120*37748cd8SNickeau    public function rewind()
121*37748cd8SNickeau    {
122*37748cd8SNickeau        $obj = new ArrayObject( $this->sourceArray );
123*37748cd8SNickeau        $this->iterator = $obj->getIterator();
124*37748cd8SNickeau    }
125*37748cd8SNickeau}
126