smoren / array-view
创建数组视图以方便数据操作,使用类似于 Python 的切片表示法选择元素,启用使用索引列表和布尔掩码的高效元素选择。
v1.0.0
2024-03-20 04:04 UTC
Requires
- php: >=7.4
Requires (Dev)
- codeception/codeception: ^4.2.1
- codeception/module-asserts: ^2.0
- php-coveralls/php-coveralls: ^2.0
- phpdocumentor/phpdocumentor: 3.0.*
- phpstan/phpstan: ^1.8
- squizlabs/php_codesniffer: 3.*
README
数组视图 是一个 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 许可证下授权。