ayesh/case-insensitive-array

一个用于以不区分大小写的方式存储和访问数据,同时保持常规数组完整性和功能的类。

v1.5.0 2021-12-05 07:10 UTC

This package is auto-updated.

Last update: 2024-08-27 14:17:59 UTC


README

Latest Stable Version GitHub license CI codecov SensioLabsInsight PHP versions

摘要

实现了 ArrayAccessCountableIterator 接口的类,允许您在强制键不区分大小写的情况下设置、获取、计数、迭代和验证。

例如,假设您需要存储一组 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.x1.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 测试已包含在内。如果您正在添加新功能,请确保添加测试覆盖率。

致谢

Ayesh Karunaratne