Skip to content

A library providing an Array-Class to store and access data in a case-insensitive fashion, while maintaining the integrity and functionality of a regular array.



Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Case Insensitive Array

Latest Stable Version GitHub license CI codecov SensioLabsInsight PHP versions


A class implementing ArrayAccess, Countable, and Iterator interfaces, and allows you to set, get, count, iterate, and validate while enforcing the keys to be case insensitive.

For example, suppose you have to store a set of HTTP headers. By definition, HTTP headers are case insensitive. With this class, you can peacefully set the same array key-pair combination any number as you feel fit, but the data set will remain consistent.

$array = new Ayesh\CaseInsensitiveArray\Strict();
$array['x-frame-options'] = 'DENY';
$array['X-FRAME-options'] = 'SAMEORIGIN';
echo $array['X-Frame-Options']; // 'SAMEORIGIN'

From the example above, notice how the array values are set two times with two keys with different case. In the echo line, the value is accessed in CamelCase, but you get the same value regardless of your querying keys case.


  • PHP 7.3 or later. For older PHP versions, use please use the 1.1.x or 1.0.x versions.


The simplest way would be to install using composer.

composer require ayesh/case-insensitive-array

If, for some reason, you can't use Composer, or don't want to (Come on!), you can integrate the class with your current PSR-4 autoloader by mapping Ayesh\CaseInsensitiveArray namespace to the repository's src folder.


This class aims to take away the fact that you are using an object. Simply use it as an array.

Initialize with an array

This is optional, but if you already have an array that you need to "import", instantiate the class with that array.

$source = [
  'x-frame-options' => 'Deny',

$array = new Ayesh\CaseInsensitiveArray\Strict($source);
// Your initial array is now indexed. That was optional. You can now set/get values freely, as you would do with a regular array.
echo $array['X-Frame-OPTIONS']; // 'SAMEORIGIN'
echo $array['X-FRAME-opTIONS']; // 'SAMEORIGIN'
var_dump(isset($array['X-Frame-Options'])); // false


You can iterate the array object using foreach(). The exact key and value will be returned.

$array = new Ayesh\CaseInsensitiveArray\Strict($source);
$array['x-frame-options'] = 'SameOrigin';
$array['X-Frame-Options'] = 'Deny'; // Notice the Came Case here.
$array['Strict-Transport-Security'] = 'max-age=31536000; includeSubDomains; preload';
foreach ($array as $key => $value) {
  echo "{$key}: {$value}\r\n";
// Output (notice how the case is preserved in X-Frame-Options):
// X-Frame-Options: Deny
// Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

You can also iterate the array with the same Iterator methods. For a near-perfect array imitation, what we need is ArrayIterator. However, it is not implemented in the current version. I would gladly work with you if you'd like to help. As of now, my scope is to have 2 classes, Strict and Union that gives basic array access, and foreach() compatibility.

Development and tests

All issues are PRs are welcome. Travis CI and PHPUnit tests are included. If you are adding new features, please make sure to add the test coverage.


By Ayesh Karunaratne.


A library providing an Array-Class to store and access data in a case-insensitive fashion, while maintaining the integrity and functionality of a regular array.








No packages published