smoren/array-view

创建数组视图以方便数据操作,使用类似于 Python 的切片表示法选择元素,启用使用索引列表和布尔掩码的高效元素选择。

v1.0.0 2024-03-20 04:04 UTC

This package is auto-updated.

Last update: 2024-09-24 01:30:59 UTC


README

Packagist PHP Version Support Scrutinizer Code Quality Coverage Status Build and test License: MIT

Array View Logo

数组视图 是一个 PHP 库,提供了强大的抽象和工具,用于处理数据列表。创建数组的视图,使用类似 Python 的符号进行切片和索引,使用链式和流畅的操作来转换和选择数据。

特性

  • 数组视图作为数组抽象
  • 正向和反向数组索引
  • 使用类似 Python 的切片表示法选择和切片
  • 过滤、映射、匹配和掩码
  • 通过管道和流畅接口链式操作

如何安装到项目中

composer require smoren/array-view

用法

索引

使用正或负索引正向或反向索引到数组中。

use Smoren\ArrayView\Views\ArrayView;

$view = ArrayView::toView([1, 2, 3, 4, 5, 6, 7]);

$view[0];  // 1
$view[1];  // 2
$view[-1]; // 7
$view[-2]; // 6

切片

使用类似 Python 的切片表示法选择元素范围:[start, stop, step]

use Smoren\ArrayView\Views\ArrayView;

$originalArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$view = ArrayView::toView($originalArray);

$view['1:6'];   // [2, 3, 4, 5, 6]
$view['1:7:2']; // [2, 4, 6]
$view[':3'];    // [1, 2, 3]
$view['::-1'];  // [9, 8, 7, 6, 5, 4, 3, 2, 1]

插入到数组的部分。

$view['1:7:2'] = [22, 44, 66];
print_r($originalArray); // [1, 22, 3, 44, 5, 66, 7, 8, 9]

子视图

使用掩码、索引和切片创建原始视图的子视图。

use Smoren\ArrayView\Selectors\IndexListSelector;
use Smoren\ArrayView\Selectors\MaskSelector;
use Smoren\ArrayView\Selectors\SliceSelector;
use Smoren\ArrayView\Views\ArrayView;

$originalArray = [1, 2, 3, 4, 5];
$view = ArrayView::toView($originalArray);

// Object-oriented style
$view->subview(new MaskSelector([true, false, true, false, true]))->toArray(); // [1, 3, 5]
$view->subview(new IndexListSelector([1, 2, 4]))->toArray();                   // [2, 3, 5]
$view->subview(new SliceSelector('::-1'))->toArray();                          // [5, 4, 3, 2, 1]

// Scripting style 
$view->subview([true, false, true, false, true])->toArray(); // [1, 3, 5]
$view->subview([1, 2, 4])->toArray();                        // [2, 3, 5]
$view->subview('::-1')->toArray();                           // [5, 4, 3, 2, 1]

$view->subview(new MaskSelector([true, false, true, false, true]))->apply(fn ($x) => x * 10);
print_r($originalArray); // [10, 2, 30, 4, 50]

子数组多索引

直接使用数组索引多选直接选择多个元素。

use Smoren\ArrayView\Selectors\IndexListSelector;
use Smoren\ArrayView\Selectors\MaskSelector;
use Smoren\ArrayView\Selectors\SliceSelector;
use Smoren\ArrayView\Views\ArrayView;

$originalArray = [1, 2, 3, 4, 5];
$view = ArrayView::toView($originalArray);

// Object-oriented style
$view[new MaskSelector([true, false, true, false, true])]; // [1, 3, 5]
$view[new IndexListSelector([1, 2, 4])];                   // [2, 3, 5]
$view[new SliceSelector('::-1')];                          // [5, 4, 3, 2, 1]

// Scripting style
$view[[true, false, true, false, true]]; // [1, 3, 5]
$view[[1, 2, 4]];                        // [2, 3, 5]
$view['::-1'];                           // [5, 4, 3, 2, 1]

$view[new MaskSelector([true, false, true, false, true])] = [10, 30, 50];
print_r($originalArray); // [10, 2, 30, 4, 50]

组合子视图

在一个流畅接口中依次组合和链式子视图,以执行多个选择操作。

use Smoren\ArrayView\Selectors\IndexListSelector;
use Smoren\ArrayView\Selectors\MaskSelector;
use Smoren\ArrayView\Selectors\SliceSelector;
use Smoren\ArrayView\Views\ArrayView;

$originalArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// Fluent object-oriented style
$subview = ArrayView::toView($originalArray)
    ->subview(new SliceSelector('::2'))                          // [1, 3, 5, 7, 9]
    ->subview(new MaskSelector([true, false, true, true, true])) // [1, 5, 7, 9]
    ->subview(new IndexListSelector([0, 1, 2]))                  // [1, 5, 7]
    ->subview(new SliceSelector('1:'));                          // [5, 7]

$subview[':'] = [55, 77];
print_r($originalArray); // [1, 2, 3, 4, 55, 6, 77, 8, 9, 10]

// Fluent scripting style
$originalArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$subview = ArrayView::toView($originalArray)
    ->subview('::2')                           // [1, 3, 5, 7, 9]
    ->subview([true, false, true, true, true]) // [1, 5, 7, 9]
    ->subview([0, 1, 2])                       // [1, 5, 7]
    ->subview('1:');                           // [5, 7]

$subview[':'] = [55, 77];
print_r($originalArray); // [1, 2, 3, 4, 55, 6, 77, 8, 9, 10]

选择器管道

创建可以选择保存并重复应用于新数组视图的选择管道。

use Smoren\ArrayView\Selectors\IndexListSelector;
use Smoren\ArrayView\Selectors\MaskSelector;
use Smoren\ArrayView\Selectors\SliceSelector;
use Smoren\ArrayView\Views\ArrayView;

$originalArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$selector = new PipeSelector([
    new SliceSelector('::2'),
    new MaskSelector([true, false, true, true, true]),
    new IndexListSelector([0, 1, 2]),
    new SliceSelector('1:'),
]);

$view = ArrayView::toView($originalArray);
$subview = $view->subview($selector);
print_r($subview[':']); // [5, 7]

$subview[':'] = [55, 77];
print_r($originalArray); // [1, 2, 3, 4, 55, 6, 77, 8, 9, 10]

文档

有关详细文档和使用示例,请参阅API 文档

单元测试

composer install
composer test-init
composer test

贡献

欢迎贡献!请随意在GitHub 仓库上打开问题或提交拉取请求。

标准

ArrayView 遵循以下标准

许可

ArrayView PHP 在 MIT 许可证下授权。