ayesh / case-insensitive-array
一个用于以不区分大小写的方式存储和访问数据,同时保持常规数组完整性和功能的类。
v1.5.0
2021-12-05 07:10 UTC
Requires
- php: ^8.1
Requires (Dev)
- phpstan/phpstan: ^1.2
- phpunit/phpunit: ^9.5
README
摘要
实现了 ArrayAccess、Countable 和 Iterator 接口的类,允许您在强制键不区分大小写的情况下设置、获取、计数、迭代和验证。
例如,假设您需要存储一组 HTTP 标头。根据定义,HTTP 标头是不区分大小写的。使用此类,您可以随意设置任何您认为合适的相同的数组键值对组合,但数据集将保持一致。
$array = new Ayesh\CaseInsensitiveArray\Strict(); $array['x-frame-options'] = 'DENY'; $array['X-FRAME-options'] = 'SAMEORIGIN'; echo $array['X-Frame-Options']; // 'SAMEORIGIN'
从上面的示例中,注意数组值如何被设置为两次,使用两个不同大小写的键。在 echo
行中,值以驼峰式访问,但无论您的查询键的大小写如何,您都会得到相同的价值。
先决条件
- PHP 7.3 或更高版本。对于旧版本的 PHP,请使用
1.1.x
或1.0.x
版本。
安装
最简单的方法是使用 composer 进行安装。
composer require ayesh/case-insensitive-array
如果您无法使用 Composer,或者不想使用(拜托!),您可以通过将 Ayesh\CaseInsensitiveArray
命名空间映射到存储库的 src
文件夹来通过当前的 PSR-4
自动加载器集成该类。
使用方法
此类旨在消除您使用对象的事实。只需将其作为数组使用即可。
使用数组初始化
这是可选的,但如果您已经有一个需要“导入”的数组,请使用该数组实例化该类。
$source = [ 'x-frame-options' => 'Deny', 'X-FRAME-OPTIONS' => 'SAMEORIGIN' ]; $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' unset($array['x-frame-options']); var_dump(isset($array['X-Frame-Options'])); // false
迭代
您可以使用 foreach() 迭代数组对象。将返回确切的键和值。
$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
您还可以使用相同的 Iterator 方法迭代数组。为了近乎完美地模仿数组,我们需要 ArrayIterator。然而,它目前在版本中尚未实现。如果您愿意帮助,我会很高兴与您合作。目前,我的目标是拥有 2 个类,Strict 和 Union,它们提供基本的数组访问和 foreach()
兼容性。
开发和测试
欢迎所有问题都是 PR。Travis CI 和 PHPUnit 测试已包含在内。如果您正在添加新功能,请确保添加测试覆盖率。