xref: /template/strap/ComboStrap/ArrayCaseInsensitive.php (revision 4cadd4f8c541149bdda95f080e38a6d4e3a640ca)
137748cd8SNickeau<?php
237748cd8SNickeau
337748cd8SNickeau
437748cd8SNickeaunamespace ComboStrap;
537748cd8SNickeau
637748cd8SNickeau
737748cd8SNickeauuse ArrayAccess;
837748cd8SNickeauuse ArrayObject;
937748cd8SNickeauuse Traversable;
1037748cd8SNickeau
1137748cd8SNickeau/**
1237748cd8SNickeau * Class ArrayCaseInsensitive
1337748cd8SNickeau * @package ComboStrap
1437748cd8SNickeau *
1537748cd8SNickeau * Wrapper around an array to make it case access insensitive
1637748cd8SNickeau */
1737748cd8SNickeauclass ArrayCaseInsensitive implements ArrayAccess, \Iterator
1837748cd8SNickeau{
1937748cd8SNickeau
2037748cd8SNickeau    /**
2137748cd8SNickeau     * A mapping between lower key and original key (ie offset)
2237748cd8SNickeau     * @var array
2337748cd8SNickeau     */
2437748cd8SNickeau    private $_keyMapping = array();
2537748cd8SNickeau    /**
2637748cd8SNickeau     * @var array
2737748cd8SNickeau     */
2837748cd8SNickeau    private $sourceArray;
2937748cd8SNickeau    /**
3037748cd8SNickeau     * @var false|mixed
3137748cd8SNickeau     */
3237748cd8SNickeau    private $valid;
3337748cd8SNickeau    private $iteratorIndex = 0;
3437748cd8SNickeau    /**
3537748cd8SNickeau     * @var \ArrayIterator
3637748cd8SNickeau     */
3737748cd8SNickeau    private $iterator;
3837748cd8SNickeau
3937748cd8SNickeau
4037748cd8SNickeau    public function __construct(array &$source = array())
4137748cd8SNickeau    {
4237748cd8SNickeau        $this->sourceArray = &$source;
4337748cd8SNickeau        array_walk($source, function ($value, &$key) {
4437748cd8SNickeau            $this->_keyMapping[strtolower($key)] = $key;
4537748cd8SNickeau        });
4637748cd8SNickeau
4737748cd8SNickeau        /**
4837748cd8SNickeau         * Iterator
4937748cd8SNickeau         */
5037748cd8SNickeau        $this->rewind();
5137748cd8SNickeau    }
5237748cd8SNickeau
5337748cd8SNickeau    public function offsetSet($offset, $value)
5437748cd8SNickeau    {
5537748cd8SNickeau
5637748cd8SNickeau        if (is_null($offset)) {
5737748cd8SNickeau            LogUtility::msg("The offset (key) is null and this is not supported");
5837748cd8SNickeau        } else {
5937748cd8SNickeau            if (is_string($offset)) {
6037748cd8SNickeau                $lowerCaseOffset = strtolower($offset);
6137748cd8SNickeau                $this->_keyMapping[$lowerCaseOffset] = $offset;
6237748cd8SNickeau                $this->sourceArray[$offset] = $value;
6337748cd8SNickeau            } else {
6437748cd8SNickeau                LogUtility::msg("The offset should be a string", LogUtility::LVL_MSG_ERROR);
6537748cd8SNickeau            }
6637748cd8SNickeau
6737748cd8SNickeau        }
6837748cd8SNickeau    }
6937748cd8SNickeau
7037748cd8SNickeau    public function offsetExists($offset)
7137748cd8SNickeau    {
7237748cd8SNickeau        if (is_string($offset)) $offset = strtolower($offset);
7337748cd8SNickeau        return isset($this->_keyMapping[$offset]);
7437748cd8SNickeau    }
7537748cd8SNickeau
7637748cd8SNickeau    public function offsetUnset($offset)
7737748cd8SNickeau    {
7837748cd8SNickeau        if (is_string($offset)) $offset = strtolower($offset);
7937748cd8SNickeau        $originalOffset = $this->_keyMapping[$offset];
8037748cd8SNickeau        unset($this->sourceArray[$originalOffset]);
8137748cd8SNickeau        unset($this->_keyMapping[$offset]);
8237748cd8SNickeau
8337748cd8SNickeau    }
8437748cd8SNickeau
8537748cd8SNickeau    public function offsetGet($offset)
8637748cd8SNickeau    {
8737748cd8SNickeau        if (is_string($offset)) $offset = strtolower($offset);
8837748cd8SNickeau        $sourceOffset = $this->_keyMapping[$offset];
89*4cadd4f8SNickeau        return $this->sourceArray[$sourceOffset] ?? null;
9037748cd8SNickeau    }
9137748cd8SNickeau
9237748cd8SNickeau    function getOriginalArray()
9337748cd8SNickeau    {
9437748cd8SNickeau        return $this->sourceArray;
9537748cd8SNickeau    }
9637748cd8SNickeau
9737748cd8SNickeau
9837748cd8SNickeau    public function current()
9937748cd8SNickeau    {
10037748cd8SNickeau        return $this->iterator->current();
10137748cd8SNickeau    }
10237748cd8SNickeau
10337748cd8SNickeau    public function next()
10437748cd8SNickeau    {
10537748cd8SNickeau        $this->iterator->next();
10637748cd8SNickeau    }
10737748cd8SNickeau
10837748cd8SNickeau    public function key()
10937748cd8SNickeau    {
11037748cd8SNickeau        return $this->iterator->key();
11137748cd8SNickeau    }
11237748cd8SNickeau
11337748cd8SNickeau    public function valid()
11437748cd8SNickeau    {
11537748cd8SNickeau        return $this->iterator->valid();
11637748cd8SNickeau    }
11737748cd8SNickeau
11837748cd8SNickeau    public function rewind()
11937748cd8SNickeau    {
12037748cd8SNickeau        $obj = new ArrayObject( $this->sourceArray );
12137748cd8SNickeau        $this->iterator = $obj->getIterator();
12237748cd8SNickeau    }
12337748cd8SNickeau}
124