phrity/util-accessor

通过访问路径处理数据集访问的实用工具。

1.1.0 2024-07-29 14:57 UTC

This package is auto-updated.

Last update: 2024-09-07 10:04:14 UTC


README

Build Status Coverage Status

简介

通过访问路径处理数据集访问的实用工具。

安装

使用 Composer 安装;

composer require phrity/util-accessor

如何使用

基本操作 get()has() 方法

任何数据集(包括数组、对象和标量值)都可以通过路径进行访问。

use Phrity\Util\Accessor;

$subject = [
    'string-val' => 'A string',
    'assoc-array-val' => [
        'string-val' => 'Another string',
    ],
    'num-array-val' => [
        'a',
    ],
    'object-val' => (object)[
        'string-val' => 'Yet another string',
    ],
];

$accessor = new Accessor();

$accessor->get($subject, 'string-val'); // => "A string"
$accessor->get($subject, 'assoc-array-val'); // => ['string-val' => "Another string"]
$accessor->get($subject, 'assoc-array-val/string-val'); // => "Another string"
$accessor->get($subject, 'num-array-val/0'); // => "a"
$accessor->get($subject, 'object-val/string-val'); // => "Yet another string"

$accessor->has($subject, 'assoc-array-val/string-val'); // => true
$accessor->has($subject, 'assoc-array-val/non-exising'); // => false

get() 方法指定默认返回值

get() 方法也可以指定默认值,当路径不匹配数据集时返回。如果未指定,在这些情况下将返回 null

use Phrity\Util\Accessor;

$subject = [
    'string-val' => 'A string',
];

$accessor = new Accessor();

$accessor->get($subject, 'non-existing'); // => null
$accessor->get($subject, 'non-existing', 'My default'); // => "My default"

set() 方法

set() 方法根据路径在数据集中添加或替换值。注意,此操作不合并值,而是显式设置。

根据作用域,可能无法在类属性上使用 set()。在这种情况下将抛出 AccessorException

use Phrity\Util\Accessor;

$subject = [
    'string-val' => 'A string',
];

$accessor = new Accessor();

$subject = $accessor->set($subject, 'string-val', 'Replaced value');
$subject = $accessor->set($subject, 'non-existing', 'Added value');
// $subject => ['string-val' => 'Replaced value', 'non-existing' => 'Added value']

指定路径分隔符

默认情况下,路径使用 / 作为分隔符。可选地,可以在构造函数中设置分隔符。

use Phrity\Util\Accessor;

$subject = [
    'object-val' => (object)[
        'string-val' => 'A string',
    ],
];

$accessor = new Accessor('.');

$accessor->get($subject, 'object-val.string-val'); // => "A string"
$accessor->has($subject, 'object-val.string-val'); // => true

路径访问器

如果应使用相同的路径访问多个数据集,则可以使用 PathAccessor。此时,路径在构造函数中指定,然后在所有对 get()has()set() 的调用中使用。

use Phrity\Util\PathAccessor;

$subject_1 = [
    'object-val' => (object)[
        'string-val' => 'A string',
    ],
];
$subject_2 = [
    'object-val' => (object)[
        'string-val' => 'Another string',
    ],
];

$accessor = new PathAccessor('object-val/string-val');

$accessor->get($subject_1); // => "A string"
$accessor->get($subject_2); // => "Another string"
$subject_1 = $accessor->set($subject_1, 'Replaced value');
$subject_2 = $accessor->set($subject_2, 'Replaced value');

数据访问器

如果应使用多个路径访问数据集,则可以使用 DataAccessor。此时,数据在构造函数中指定,然后在所有对 get()has()set() 的调用中使用。

use Phrity\Util\DataAccessor;

$subject = [
    'object-val' => (object)[
        'string-val' => 'A string',
        'int-val' => 23,
    ],
];


$accessor = new DataAccessor(subject);

$accessor->get('object-val/string-val'); // => "A string"
$accessor->get('object-val/int-val'); // => 23
$accessor->set('object-val/string-val', 'Replaced string');
$accessor->set('object-val/int-val', 48);

我想将其纳入自己的类中

当然,没问题。只需在您的类中使用 AccessorTrait,并调用可用的工作方法。内部递归工作方法将路径作为路径段的数组。还有一个辅助程序可以从字符串路径中提取数组路径。

use Phrity\Util\AccessorTrait;

class MyClass
{
    use AccessorTrait;

    public function doThings(): void
    {
        $my_data = ['array-val' => ['string-val' => 'A string']];
        $exists = $this->accessorHas($my_data, ['array-val', 'string-val']);
        $something = $this->accessorGet($my_data, ['array-val', 'string-val'], 'My default');

        $my_path = $this->accessorParsePath('array-val#string-val', '#');
        $exists = $this->accessorHas($my_data, $my_path);
        $something = $this->accessorGet($my_data, $my_path, 'My default');
        $modified = $this->accessorSet($my_data, $my_path, 'My new value');
    }
}

版本