xref: /template/strap/ComboStrap/ArrayCaseInsensitive.php (revision 94bd64624391aac031cc0626cae58a5718ca10d8)
137748cd8SNickeau<?php
237748cd8SNickeau
337748cd8SNickeau
437748cd8SNickeaunamespace ComboStrap;
537748cd8SNickeau
637748cd8SNickeau
737748cd8SNickeauuse ArrayAccess;
837748cd8SNickeauuse ArrayObject;
904fd306cSNickeauuse Countable;
1037748cd8SNickeau
1137748cd8SNickeau/**
1237748cd8SNickeau * Class ArrayCaseInsensitive
1337748cd8SNickeau * @package ComboStrap
1437748cd8SNickeau *
1537748cd8SNickeau * Wrapper around an array to make it case access insensitive
1637748cd8SNickeau */
1704fd306cSNickeauclass ArrayCaseInsensitive implements ArrayAccess, \Iterator, Countable
1837748cd8SNickeau{
1937748cd8SNickeau
2037748cd8SNickeau    /**
2137748cd8SNickeau     * A mapping between lower key and original key (ie offset)
2237748cd8SNickeau     * @var array
2337748cd8SNickeau     */
2404fd306cSNickeau    private array $_keyMapping = array();
2537748cd8SNickeau    /**
2637748cd8SNickeau     * @var array
2737748cd8SNickeau     */
2804fd306cSNickeau    private array $sourceArray;
2937748cd8SNickeau    /**
3037748cd8SNickeau     * @var false|mixed
3137748cd8SNickeau     */
3237748cd8SNickeau    private $valid;
3304fd306cSNickeau    private int $iteratorIndex = 0;
3437748cd8SNickeau    /**
3537748cd8SNickeau     * @var \ArrayIterator
3637748cd8SNickeau     */
3704fd306cSNickeau    private \ArrayIterator $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
70cc1661d1Sgerardnico    public function offsetExists($offset): bool
7137748cd8SNickeau    {
7237748cd8SNickeau        if (is_string($offset)) $offset = strtolower($offset);
7337748cd8SNickeau        return isset($this->_keyMapping[$offset]);
7437748cd8SNickeau    }
7537748cd8SNickeau
7637748cd8SNickeau    public function offsetUnset($offset)
7737748cd8SNickeau    {
78*94bd6462Sgerardnico
7937748cd8SNickeau        if (is_string($offset)) $offset = strtolower($offset);
80*94bd6462Sgerardnico        $originalOffset = $this->_keyMapping[$offset] ?? null;
8137748cd8SNickeau        unset($this->sourceArray[$originalOffset]);
8237748cd8SNickeau        unset($this->_keyMapping[$offset]);
8337748cd8SNickeau
8437748cd8SNickeau    }
8537748cd8SNickeau
8637748cd8SNickeau    public function offsetGet($offset)
8737748cd8SNickeau    {
8837748cd8SNickeau        if (is_string($offset)) $offset = strtolower($offset);
890c9fd5adSgerardnico        $sourceOffset = $this->_keyMapping[$offset] ?? null;
900c9fd5adSgerardnico        if ($sourceOffset === null) {
910c9fd5adSgerardnico            return null;
920c9fd5adSgerardnico        }
934cadd4f8SNickeau        return $this->sourceArray[$sourceOffset] ?? null;
9437748cd8SNickeau    }
9537748cd8SNickeau
9604fd306cSNickeau    function getOriginalArray(): array
9737748cd8SNickeau    {
9837748cd8SNickeau        return $this->sourceArray;
9937748cd8SNickeau    }
10037748cd8SNickeau
10137748cd8SNickeau
10237748cd8SNickeau    public function current()
10337748cd8SNickeau    {
10437748cd8SNickeau        return $this->iterator->current();
10537748cd8SNickeau    }
10637748cd8SNickeau
10737748cd8SNickeau    public function next()
10837748cd8SNickeau    {
10937748cd8SNickeau        $this->iterator->next();
11037748cd8SNickeau    }
11137748cd8SNickeau
11237748cd8SNickeau    public function key()
11337748cd8SNickeau    {
11437748cd8SNickeau        return $this->iterator->key();
11537748cd8SNickeau    }
11637748cd8SNickeau
117cc1661d1Sgerardnico    public function valid(): bool
11837748cd8SNickeau    {
11937748cd8SNickeau        return $this->iterator->valid();
12037748cd8SNickeau    }
12137748cd8SNickeau
12237748cd8SNickeau    public function rewind()
12337748cd8SNickeau    {
12437748cd8SNickeau        $obj = new ArrayObject($this->sourceArray);
12537748cd8SNickeau        $this->iterator = $obj->getIterator();
12637748cd8SNickeau    }
12704fd306cSNickeau
12804fd306cSNickeau    public function count(): int
12904fd306cSNickeau    {
13004fd306cSNickeau        return sizeof($this->sourceArray);
13104fd306cSNickeau    }
13237748cd8SNickeau}
133