sevavietl / 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: 2022-02-01 13:14:49 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
作为键。
一次性数组
有时您想通过键从数组中获取值,并在之后unset
这个键。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`