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