sevavietl/arrays

该包已被废弃,不再维护。作者建议使用thorough-php/arrays包。

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

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

This package is not auto-updated.

Last update: 2022-02-01 13:14:49 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作为键。

一次性数组

有时您想通过键从数组中获取值,并在之后unset这个键。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`