gears / arrays
一组数组转换和操作工具。
Requires
- illuminate/support: 5.*
- patchwork/utf8: 1.*
- zendframework/zend-dom: 2.2.x
- zendframework/zend-json: 2.2.x
Requires (Dev)
- codegyre/robo: *
- guzzlehttp/guzzle: 4.*
- illuminate/database: 5.*
- mockery/mockery: ~0.9
- phpunit/phpunit: 4.*
README
寻找维护者,我现在几乎不再做PHP开发,我已经转向其他领域,现在主要在dotnet core、node.js和golang上工作。如果有人有兴趣接管这些项目,请与我联系 - brad@bjc.id.au
数组齿轮
一组数组转换和操作工具。有两个API
- 一个基于过程的API,使用命名空间函数/静态方法调用。
- 和一个更流畅的对象API。
我不会在这里记录每个函数的详细说明,但请参见以下一些通用用法示例。其余的你可以通过阅读源代码自行解决,它相当直接且注释清晰。
如何安装
通过composer安装很简单
composer require gears/arrays:*
如何使用
以下是一些过程示例
$data = []; $data = Gears\Arrays\add($data, 'a.b.c', 'd'); // $data now looks like: ['a' => ['b' => ['c' => 'd']]]; Gears\Arrays\set($data, 'a.b.c', 'foo'); // $data now looks like: ['a' => ['b' => ['c' => 'foo']]]; Gears\Arrays\forget($data, 'a.b.c'); // $data now looks like: ['a' => ['b' => []]];
在PHP 5.6中,您可以导入函数,因此可以将上面的代码改为
// Import the functions use function Gears\Arrays\add; use function Gears\Arrays\set; use function Gears\Arrays\forget; // This results in the same array $data = []; $data = add($data, 'a.b.c', 'd'); set($data, 'a.b.c', 'foo'); forget($data, 'a.b.c');
注意:所有函数名称都是驼峰式命名。
在PHP 5.6之前,这是不可能的。因此,您可以这样做
// Import the Array class use Gears\Arrays as Arr; // This results in the same array $data = []; $data = Arr::add($data, 'a.b.c', 'd'); Arr::set($data, 'a.b.c', 'foo'); Arr::forget($data, 'a.b.c');
注意:就像PHP中包含的标准array_函数一样。一些函数对数组的引用进行操作,而其他函数将接受一个副本并返回修改后的或其他值。
流畅数组对象
好吧,这部分包很大,所以需要单独的如何使用部分。要开始,您可以创建一个新的对象,如下所示
$data = new Gears\Arrays\Fluent(); $data[] = 'foo'; $data[] = 'bar'; foreach ($data as $item) { echo $item.','; } // you would see: foo,bar
如你所见,数据变量现在是一个类似数组的对象。这是关键,因为有时某些函数会期望真正的数组。要从流畅对象中获取真正的数组,您可以这样做
$real_array = $data->toArray();
您可能希望使用工厂方法来初始化新的流畅对象。
// Import the Array class use Gears\Arrays as Arr; // Use the factory method $data = Arr::a();
当您使用流畅API时,请注意后续方法调用签名与过程API相比如何变化。您不再需要提供要执行的操作数组的第一个参数。这会自动为您完成。
以下是过程API中的相同示例
$data = Arr::a(); $data->add('a.b.c', 'd'); $data->set('a.b.c', 'foo'); $data->forget('a.b.c');
现在一个敏锐的眼睛可能会认为在第2行有一个错误。您可能会认为第二行应该看起来像这样
$data = $data->add('a.b.c', 'd');
但您是错的。与Gears\String
包不同,虽然Gears\Arrays
的流畅API和过程API很相似,但它们并不相同。部分原因是数组的复杂性质。请注意,这两个API中都有同名的方法,但执行的操作略有不同。
例如,我也可以使用add方法,如下所示
Arr::a([1,2,3])->add(4)->each(function($v){ echo $v.','; }); // would output: 1,2,3,4,
递归性质:与标准的Illuminate\Support\Collection
对象不同,Gears\Arrays\Fluent
对象是递归的。每个新的流畅对象只有在访问时才会加载,从而最大限度地减少性能损失。
让我们通过一个示例来展示
$data = Arr::a(['a' => ['b' => ['c' => 'd']]]); print_r($data); // you would see something like: Gears\Arrays\Fluent Object ( [items:protected] => Array ( [a] => Array ( [b] => Array ( [c] => 'd' ) ) ) ) // now lets access something $data['a']['b']['c']; print_r($data); // you would now see something like: Gears\Arrays\Fluent Object ( [items:protected] => Array ( [a] => Gears\Arrays\Fluent Object ( [items:protected] => Array ( [b] => Gears\Arrays\Fluent Object ( [items:protected] => Array ( [c] => d ) ) ) ) ) )
对象访问:我想向大家展示的是,现在您可以像使用对象一样使用数组。再次,我喜欢我的例子
$data1 = Arr::a(); $data1['a'] = []; $data1['a']['b'] = []; $data1['a']['b']['c'] = 'd'; $data2 = Arr::a(); $data2->a = []; $data2->a->b = []; $data2->a->b->c = 'd'; // $data1 == $data2
本Readme仅概述了Fluent API所能实现的功能。我保证即将提供完整的文档……但我也有自己的生活。
Laravel集成
Gears\Arrays 已设计为与 Laravel Arr 类功能兼容,实际上它扩展了该类。因此,您以前能做的任何事情现在都可以做,并且还能做更多。
默认情况下,Laravel没有将Arr类设置为别名。因此,您可以在文件 /app/config/app.php
中自由添加以下内容
'Arr' => 'Gears\Arrays',
此外,请注意
Gears\Arrays\Fluent
再次与标准Illuminate\Support\Collection
类兼容。
鸣谢
感谢 axelarge 提供的灵感,我借鉴了他的方法,稍作重构,并添加了一些自己的方法。 https://github.com/axelarge/php-array-tools
此外,Laravel中由 Illuminate\Support\Arr
类提供的所有方法已集成到 Gears\Array
中。 https://github.com/laravel/framework/blob/4.2/src/Illuminate/Support/Arr.php
此外,来自Laravel的 Illuminate\Support\Collection
,我们的Fluent接口扩展了这个类。有些人将Laravel Collection类称为“超级数组”。因此,我不确定您会如何称呼我们的Fluent类。数组+插入硬核药物...
由Brad Jones开发 - brad@bjc.id.au