irfantoor / collection
实现 ArrayAccess, Countable 和 IteratorAggregate 的集合
Requires
- php: >=7.3
Requires (Dev)
- irfantoor/test: ~0.7
README
实现 ArrayAccess, Countable 和 IteratorAggregate 的集合
标识符可以使用点表示法来访问层次结构中的标识符,例如,要访问 $config['debug']['log']['file']
,您可以使用点表示法编写如下: $config['debug.log.file']
初始化
在创建新实例时,您可以通过传递一个键值对数组来初始化。
<?php use IrfanTOOR\Collection; $init = [ 'app' => [ 'name' => 'My App', 'version' => '1.1', ], 'debug' => [ 'level' => 1, 'log' => [ 'enabled' => 0, 'channel' => 'DEBUG', 'file' => '/tmp/debug.log', ], ] ]; $app = new IrfanTOOR\Collection($init);
设置
您可以使用 'set' 方法或使用数组访问机制在集合中设置一个标识符
use IrfanTOOR\Collection; $app = new IrfanTOOR\Collection(); # setting hello => world $app->set('hello', 'world'); # using an array notation $app['hello'] = 'world'; # defining multiple $app->setMultiple([ 'hello' => 'world', 'box' => 'empty', 'something' => null, 'array' => [ 'action' => 'go', 'step' => 1, ], ]); # defining sub values $app->set('app.name', 'Another App'); $app->set('debug.level', 2);
或使用数组访问机制
$app['hello'] = 'world'; $app['debug.log.file'] = '/my/debug/log/file.log';
获取
您可以使用 'get' 方法通过其标识符从集合中获取存储的值
$debug_level = $app->get('debug.level'); # returns the value stored against this identifier or returns 0 if the identifier # is not present in the collection $debug_log_level = $app->get('debug.log.level', 0);
您也可以使用数组访问
$debug_level = $app['debug.level']; # returns the value stored against this identifier or returns 0 if the identifier # is not present in the collection $debug_log_level = $app['debug.log.level'] ?? 0;
检查值是否存在于集合中
您可以使用 'has' 方法检查集合是否有标识符为 id 的条目
if ($app->has('debug.level')) { # this will be executed even if the given identifier has the value NULL, 0 # or false echo 'debug.level is present in the collection' }
使用数组访问,上述代码将变为
if (isset($app['debug.level']) { # this will be executed even if the given identifier has the value NULL, 0 # or false echo 'debug.level is present in the collection' }
删除条目
您可以使用 'remove' 方法或对元素使用 unset
# using method remove $app->remove('debug.level'); # using unset unset($app['debug.level']);
集合到数组
可以使用 'toArray' 方法将集合转换为数组
$array = $app->toArray();
标识符数组
可以通过使用 'keys' 方法检索标识符数组
$ids_array = $app->keys();
计数
可以使用 'count' 方法检索集合中存在的项目数量。请注意,它将返回基础级别项目的数量。
# will return 2 for the Collection defined in initialization section $count = $app->count();
迭代
集合可以直接用于 foreach 循环或需要迭代器的地方。例如,以下代码
foreach($app->toArray() as $k => $v) { print_r([$k => $v]); }
可以简化为
foreach($app as $k => $v) { print_r([$k => $v]); }
锁定
通过使用锁定函数初始化后,集合可以被设置为只读,之后无法向集合添加、修改或删除值。
只读集合的使用场景是应用程序的配置。
例如:
$config = new IrfanTOOR\Collection([ 'app' => [ 'name' => 'My App', 'version' => '1.1', ], 'debug' => [ 'level' => 1, 'log' => [ 'enabled' => 0, 'channel' => 'DEBUG', 'file' => '/tmp/debug.log', ], ] ]); $config->lock(); # will not modify the values $config->set('debug.level', 0); $config->set('app.version', '1.2'); # will not remove the value $config->remove('debug.log');
实用函数
filter
返回返回 true 的元素集合
注意:$callback 函数必须按照以下顺序使用参数:param_1 $value 当前元素的值 param_2 $key 当前元素的键
$c = new Collection(['10', 1, 2, 3, 4]); $callback = function ($key, $value) { return is_int($value); }; $int = $c->filter($callback); # 1, 2, 3, 4
map
返回应用回调函数到此集合元素值的新集合
$callback = function ($key, $value) { return $value * $value; }; # int is the collection from previous example $int2 = $int->map($callback); # 1, 4, 9, 16
reduce
通过将函数应用于所有元素,将数组缩减为结果
注意:$callback 函数必须按照以下顺序使用参数:param_1 $carry 上一个元素回调操作的结果 param_2 $value 当前元素的值 param_3 $key 当前元素的键
$callback = function ($key, $value, $carry) { return $carry + $value; }; $sum = $int2->reduce($callback); # 30