xref: /template/strap/ComboStrap/ArrayCaseInsensitive.php (revision 8b985170cd57593f69788c3328594a23c40a41f5)
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;
4370bbd7f1Sgerardnico        array_walk($source, function ($value, $key) {
4437748cd8SNickeau            $this->_keyMapping[strtolower($key)] = $key;
4537748cd8SNickeau        });
4637748cd8SNickeau
4737748cd8SNickeau        /**
4837748cd8SNickeau         * Iterator
4937748cd8SNickeau         */
5037748cd8SNickeau        $this->rewind();
5137748cd8SNickeau    }
5237748cd8SNickeau
53*8b985170Sgerardnico    public function offsetSet($offset, $value): void
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
76*8b985170Sgerardnico    public function offsetUnset($offset): void
7737748cd8SNickeau    {
7894bd6462Sgerardnico
7937748cd8SNickeau        if (is_string($offset)) $offset = strtolower($offset);
8094bd6462Sgerardnico        $originalOffset = $this->_keyMapping[$offset] ?? null;
8137748cd8SNickeau        unset($this->sourceArray[$originalOffset]);
8237748cd8SNickeau        unset($this->_keyMapping[$offset]);
8337748cd8SNickeau
8437748cd8SNickeau    }
8537748cd8SNickeau
8670bbd7f1Sgerardnico
8737748cd8SNickeau    public function offsetGet($offset)
8837748cd8SNickeau    {
8937748cd8SNickeau        if (is_string($offset)) $offset = strtolower($offset);
900c9fd5adSgerardnico        $sourceOffset = $this->_keyMapping[$offset] ?? null;
910c9fd5adSgerardnico        if ($sourceOffset === null) {
920c9fd5adSgerardnico            return null;
930c9fd5adSgerardnico        }
944cadd4f8SNickeau        return $this->sourceArray[$sourceOffset] ?? null;
9537748cd8SNickeau    }
9637748cd8SNickeau
9704fd306cSNickeau    function getOriginalArray(): array
9837748cd8SNickeau    {
9937748cd8SNickeau        return $this->sourceArray;
10037748cd8SNickeau    }
10137748cd8SNickeau
10237748cd8SNickeau
10337748cd8SNickeau    public function current()
10437748cd8SNickeau    {
10537748cd8SNickeau        return $this->iterator->current();
10637748cd8SNickeau    }
10737748cd8SNickeau
108*8b985170Sgerardnico    public function next(): void
10937748cd8SNickeau    {
11037748cd8SNickeau        $this->iterator->next();
11137748cd8SNickeau    }
11237748cd8SNickeau
11337748cd8SNickeau    public function key()
11437748cd8SNickeau    {
11537748cd8SNickeau        return $this->iterator->key();
11637748cd8SNickeau    }
11737748cd8SNickeau
118cc1661d1Sgerardnico    public function valid(): bool
11937748cd8SNickeau    {
12037748cd8SNickeau        return $this->iterator->valid();
12137748cd8SNickeau    }
12237748cd8SNickeau
123*8b985170Sgerardnico    public function rewind(): void
12437748cd8SNickeau    {
12537748cd8SNickeau        $obj = new ArrayObject($this->sourceArray);
12637748cd8SNickeau        $this->iterator = $obj->getIterator();
12737748cd8SNickeau    }
12804fd306cSNickeau
12904fd306cSNickeau    public function count(): int
13004fd306cSNickeau    {
13104fd306cSNickeau        return sizeof($this->sourceArray);
13204fd306cSNickeau    }
13337748cd8SNickeau}
134