fi1a/collection

PHP中的数据结构和集合

2.0.7 2023-02-21 02:20 UTC

README

Latest Version Software License PHP Version Coverage Status Total Downloads Support mail

fi1a/collection 包提供数据结构和集合类。

安装

可以使用 Composer 将此包作为依赖项安装。

composer require fi1a/collection

使用

数据类型

Fi1a\Collection\DataType\ArrayObject 对象,类似于数组操作

实现了 Fi1a\Collection\DataType\ValueObjectInterface 接口。

use Fi1a\Collection\DataType\ArrayObject;

$arrayObject = new ArrayObject(['foo', 'bar', 'baz',]);

foreach ($arrayObject as $value) {
    $value; // 'foo', 'bar', 'baz'
}

count($arrayObject); // 3

Fi1a\Collection\DataType\MapArrayObject 对象,类似于数组操作

实现了 Fi1a\Collection\DataType\MapArrayObjectInterface 接口,扩展了数组的用法。

use Fi1a\Collection\DataType\MapArrayObject;

$arrayObject = new MapArrayObject();

$arrayObject->add('foo');
$arrayObject->add('bar');
$arrayObject->add('baz');

foreach ($arrayObject as $value) {
    $value; // 'foo', 'bar', 'baz'
}

$arrayObject->count(); // 3

可用方法

Fi1a\Collection\DataType\PathAccess 类实现了通过路径访问值

实现了 Fi1a\Collection\DataType\PathAccessInterface 接口。该类允许通过路径(foo:bar:baz)访问数组键。

use Fi1a\Collection\DataType\PathAccess;

$register = new PathAccess(['foo' => ['bar' => ['baz' => 1], 'qux' => 2,],]);

$register->get('foo:bar:baz'); // 1
$register->get('foo:qux'); // 2

$register->has('foo:bar'); // true
$register->has('foo:bar:baz'); // true
$register->has('foo:bar:baz:bat'); // false

Fi1a\Collection\DataType\ValueObject 对象值,具有 set/get 方法

实现了 Fi1a\Collection\DataType\ValueObjectInterface 接口。它提供了设置/获取值的方法,并像数组一样工作。

use Fi1a\Collection\DataType\ValueObject;

class Foo extends ValueObject
{
    public function getBar(): string
    {
        return (string) $this->modelGet('bar');
    }

    public function setBar(string $bar): self
    {
        $this->modelSet('bar', $bar . 'baz');

        return $this;
    }
}

$valueObject = new Foo();

$valueObject['bar'] = 'bar';

isset($valueObject['bar']); // true
$valueObject['bar']; // 'barbaz'
$valueObject->getBar(); // 'barbaz'

辅助器

Fi1a\Collection\Helpers\ArrayHelper 辅助器

包含用于操作数组的辅助方法。

集合

Fi1a\Collection\Collection 值集合

实现了 Fi1a\Collection\CollectionInterface 接口。

可能的值类型

  • mixed
  • array
  • boolean, bool
  • callable
  • int, integer
  • float, double
  • numeric
  • string
  • resource
  • scalar
  • object
  • 类名
use Fi1a\Collection\Collection;

$collection = new Collection('string');

$collection[] = 'foo';
$collection->add('bar');

foreach ($collection as $item) {
    $item; // 'foo', 'bar'
}

count($collection); // 2

$collection->has(0); // true
$collection->has(1); // true
$collection->has(2); // false

类实例集合

实现了 Fi1a\Collection\InstanceCollectionInterface 接口。

use Fi1a\Collection\AbstractInstanceCollection;

class Foo
{
    private $value = null;

    public function __construct(string $value)
    {
        $this->value = $value;
    }

    public function getValue()
    {
        return $this->value;
    }
}

class FooCollection extends AbstractInstanceCollection
{
    public static function factory($key, $value)
    {
        return new Foo((string) $value);
    }

    public static function isInstance($value): bool
    {
        return $value instanceof Foo;
    }
}

$collection = new FooCollection(['bar',]);
$collection[] = 'baz';
$collection[] = new Foo('qux');

foreach ($collection as $foo) {
    $foo->getValue(); // 'bar', 'baz', 'qux'
}

Fi1a\Collection\DataType\ArrayObject 类实例集合

Fi1a\Collection\AbstractInstanceCollection 的私有实现,用于 Fi1a\Collection\DataType\ArrayObject 类。

use Fi1a\Collection\ArrayObjectCollection;
use Fi1a\Collection\DataType\ArrayObject;

$collection = new ArrayObjectCollection([['foo',],]);
$collection[] = ['bar',];
$collection[] = new ArrayObject(['baz',]);

foreach ($collection as $item) {
    $item[0]; // 'foo', 'bar', 'baz'
}

count($collection); // 3

Fi1a\Collection\DataType\MapArrayObject 类实例集合

Fi1a\Collection\AbstractInstanceCollection 的私有实现,用于 Fi1a\Collection\DataType\MapArrayObject 类。

use Fi1a\Collection\MapArrayObjectCollection;
use Fi1a\Collection\DataType\MapArrayObject;

$collection = new MapArrayObjectCollection([['foo',],]);
$collection[] = ['bar',];
$collection[] = new MapArrayObject(['baz',]);

foreach ($collection as $item) {
    $item->first(); // 'foo', 'bar', 'baz'
}

$collection->count(); // 3

Fi1a\Collection\DataType\PathAccess 类实例集合

Fi1a\Collection\AbstractInstanceCollection 的私有实现,用于 Fi1a\Collection\DataType\PathAccess 类。

use Fi1a\Collection\PathAccessCollection;
use Fi1a\Collection\DataType\PathAccess;

$collection = new PathAccessCollection([['foo' => ['bar' => 1,],],]);
$collection[] = ['foo' => ['bar' => 2,],];
$collection[] = new PathAccess(['foo' => ['bar' => 3,],]);

foreach ($collection as $item) {
    $item->get('foo:bar'); // 1, 2, 3
}

count($collection); // 3

Fi1a\Collection\Queue 队列

实现双向队列的有序元素集合。

use Fi1a\Collection\Queue;

$queue = new Queue();
$queue->addBegin(1); // true
$queue->addBegin(2); // true
$queue->pollEnd(); // 1
$queue->pollEnd(); // 2
$queue->pollEnd(); // null
$queue->addBegin(3); // true
$queue->pollEnd(); // 3
$queue->pollEnd(); // null

Fi1a\Collection\TypedValueQueue 类型化值队列

实现带有类型检查的双向队列的有序元素集合。

可能的值类型

  • mixed
  • array
  • boolean, bool
  • callable
  • int, integer
  • float, double
  • numeric
  • string
  • resource
  • scalar
  • object
  • 类名

示例,作为类型 boolean

use Fi1a\Collection\TypedValueQueue;
use Fi1a\Collection\Exception\InvalidArgumentException;

$queue = new TypedValueQueue('boolean');
$queue->addBegin(true); // true
$queue->count(); // 1
$queue->addBegin(false); // true
$queue->count(); // 2
try {
    $queue->addBegin(10); // throw InvalidArgumentException
} catch (InvalidArgumentException $exception) {

}

示例,作为类型 类

use Fi1a\Collection\TypedValueQueue;
use Fi1a\Collection\Exception\InvalidArgumentException;

$queue = new TypedValueQueue(\stdClass::class);
$queue->addBegin(new \stdClass()); // true
try {
    $queue->addBegin(10); // throw InvalidArgumentException
} catch (InvalidArgumentException $exception) {

}