这是一个数组包装器的集合

v2.0 2019-03-08 13:36 UTC

This package is not auto-updated.

Last update: 2024-09-29 19:10:38 UTC


README

Build Status Coverage Status License: MIT PHPStan

这是一个数组包装器的集合。

目录

复合键数组

有时,能够使用一个类似于数组的关键字访问嵌套值是有用的(关于这个问题有人提出了这样的问题: 在 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 有一些限制

  1. 您不能使用包含 / 的键。
  2. 您不能使用 null 作为键。

点键数组

此类不是使用类似数组的键,而是使用由 . 分隔的键字符串。

    $array = new DottedKeyArray([
        'foo' => [
            'bar' => 'baz'
        ]
    ]);

    var_dump($array['foo.bar']); // => string(3) "baz"

CompositeKeyArray 相比,DottedKeyArray 有一些限制

  1. 您不能使用包含 . 的键。
  2. 您不能使用 null 作为键。

一次性数组

有时,您想要通过键从数组中获取值,然后在之后取消设置此键。OneOffArray 类可以帮助您完成此操作。

同样,此类可以与 CompositeKeyArray 或其派生类(如 XPathKeyArrayDottedKeyArray)结合使用。实际上,它可以与任何实现 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`