gears/arrays

该包已被废弃且不再维护。没有建议的替代包。

一组数组转换和操作工具。

v0.7.0 2015-02-05 06:59 UTC

This package is not auto-updated.

Last update: 2020-11-13 08:05:08 UTC


README

寻找维护者,我现在几乎不再做PHP开发,我已经转向其他领域,现在主要在dotnet core、node.js和golang上工作。如果有人有兴趣接管这些项目,请与我联系 - brad@bjc.id.au

数组齿轮

Build Status Latest Stable Version Total Downloads License

一组数组转换和操作工具。有两个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