irfantoor/collection

实现 ArrayAccess, Countable 和 IteratorAggregate 的集合

3.0.2 2023-08-05 15:16 UTC

This package is auto-updated.

Last update: 2024-09-05 17:32:20 UTC


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