thorough-php / arrays
这是一个数组包装器的集合
Requires
- php: >=7.2
Requires (Dev)
- php-coveralls/php-coveralls: ^2.1
- phpstan/phpstan: ^0.11.2
- phpunit/phpunit: ^8.0
This package is not auto-updated.
Last update: 2024-09-29 19:10:38 UTC
README
这是一个数组包装器的集合。
目录
复合键数组
有时,能够使用一个类似于数组的关键字访问嵌套值是有用的(关于这个问题有人提出了这样的问题: 在 quora,在 stackoverflow)。
CompositeKeyArray
类允许您使用类似数组(嵌套)的关键字执行所有基本数组操作。它实现了 ArrayAccess
接口
1. offsetExists
您可以检查嵌套键是否存在。
$array = new CompositeKeyArray([ 'foo' => [ 'bar' => 'baz' ] ]); var_dump(isset($array[['foo', 'bar']])); // => bool(true) var_dump(isset($array[['foo', 'quux']])); // => bool(false)
2. offsetGet
您可以通过嵌套键获取值。如果嵌套键未设置,将抛出 UndefinedOffsetException
。
$array = new CompositeKeyArray([ 'foo' => [ 'bar' => 'baz' ] ]); var_dump($array[['foo', 'bar']]); // => string(3) "baz" var_dump($array[['foo', 'quux']]); // => PHP Fatal error: Uncaught UndefinedOffsetException: Undefined offset quux.
3. offsetSet
您可以为嵌套键设置值。
$array = new CompositeKeyArray(); $array[['foo', 'bar']] = 'baz'; var_dump($array[['foo', 'bar']]); // => string(3) "baz"
有一个陷阱。当您尝试执行 $array['foo']['bar'] = 'baz'
时,您将得到 Indirect modification of overloaded element of CompositeKeyArray has no effect
。原因已在 此处 解释。因此,为了达到预期的结果,您必须执行以下操作
$array = new CompositeKeyArray([ 'foo' => [] ]); $array['foo']['bar'] = 'baz'; // => PHP Notice: Indirect modification of overloaded element of CompositeKeyArray has no effect var_dump($array['foo']); // => array(0) {} $array[['foo', 'bar']] = 'baz'; var_dump($array['foo']); // => array(1) {["bar"] => string(3) "baz"}
但还有一个边缘情况:当您需要在数组的末尾追加元素时。
$array = new CompositeKeyArray([ 'foo' => [] ]); $array[[[]]] = 'bar'; $array[['foo', []]] = 'baz'; $array[['foo', []]] = 'qux'; var_dump($array->toArray()); // => array(2) { // ["foo"]=> // array(2) { // [0]=> // string(3) "baz" // [1]=> // string(3) "qux" // } // [0]=> // string(3) "bar" // }
4. offsetUnset
您可以取消设置嵌套键。
$array = new CompositeKeyArray([ 'foo' => [ 'bar' => 'baz' ] ]); unset($array[['foo', 'bar']]); var_dump($array['foo']); // => array(0) {}
在进行嵌套操作后,您可能希望获取回 实际数组。这可以通过调用 $array->toArray()
来完成。
XPath 键数组
这并不是真正的 xpath! 此类不是使用类似数组的键,而是使用由 /
分隔的键字符串。
$array = new XPathKeyArray([ 'foo' => [ 'bar' => 'baz' ] ]); var_dump($array['foo/bar']); // => string(3) "baz"
这是从一篇旧文章中得到的灵感 这篇文章。
与 CompositeKeyArray
相比,XPathKeyArray
有一些限制
- 您不能使用包含
/
的键。 - 您不能使用
null
作为键。
点键数组
此类不是使用类似数组的键,而是使用由 .
分隔的键字符串。
$array = new DottedKeyArray([ 'foo' => [ 'bar' => 'baz' ] ]); var_dump($array['foo.bar']); // => string(3) "baz"
与 CompositeKeyArray
相比,DottedKeyArray
有一些限制
- 您不能使用包含
.
的键。 - 您不能使用
null
作为键。
一次性数组
有时,您想要通过键从数组中获取值,然后在之后取消设置此键。OneOffArray
类可以帮助您完成此操作。
同样,此类可以与 CompositeKeyArray
或其派生类(如 XPathKeyArray
或 DottedKeyArray
)结合使用。实际上,它可以与任何实现 ArrayAccess
的对象结合使用。
单写数组
如果您想确保您的数组中的每个偏移量只写入一次,您可以使用 WriteOnceArray
。如果您尝试将特定偏移量设置多次,将抛出 IllegalOffsetException
$array = new WriteOnceArray(); $array['foo'] = 'bar'; // => OK $array['foo'] = 'baz'; // => throws `IllegalOffsetException`
因为 offsetExists
方法用于确保一次写入行为,因此调用 offsetUnset
方法是不合法的
$array = new WriteOnceArray([ 'foo' => 'bar', ]); unset($array['foo']); // => throws `IllegalOffsetUnsetMethodCallException`