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