fi1a / collection
PHP中的数据结构和集合
Requires
- php: ^7.3 || ^8
- ext-json: *
- ext-mbstring: *
Requires (Dev)
- captainhook/captainhook: ^5.4
- phpunit/phpunit: ^9.3
- slevomat/coding-standard: ^6.3
- squizlabs/php_codesniffer: ^3.5
- vimeo/psalm: ^4.3
README
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) { }