myclabs / array-comparator
数组比较器
1.1.0
2014-08-04 11:36 UTC
Requires
- php: >=5.3.0
This package is not auto-updated.
Last update: 2024-09-12 14:57:36 UTC
README
数组比较辅助工具。
原则
以下是默认行为
默认情况下,比较数组键。此行为可以自定义。
用法
$comparator = new ArrayComparator(); $comparator->whenEqual(function ($item1, $item2) { // Do your stuff ! }) ->whenDifferent(function ($item1, $item2) { // Do your stuff ! }) ->whenMissingRight(function ($item1) { // Do your stuff ! }) ->whenMissingLeft(function ($item2) { // Do your stuff ! }); $comparator->compare($array1, $array2);
例如,对于 Doctrine 实体的高级示例
$comparator = new ArrayComparator(); // Set that items are considered the same if they have the same id // Array keys are ignored in this example $comparator->setItemIdentityComparator(function ($key1, $key2, $item1, $item2) { return $item1->id === $item2->id; }); // Items have differences if their name differ $comparator->setItemComparator(function ($item1, $item2) { return $item1->name === $item2->name; }); $comparator->whenEqual(function ($item1, $item2) { // Do your stuff ! }) ->whenDifferent(function ($item1, $item2) { // Do your stuff ! }) ->whenMissingRight(function ($item1) { // Do your stuff ! }) ->whenMissingLeft(function ($item2) { // Do your stuff ! }); $comparator->compare($array1, $array2);
注意,您还可以使用任何 PHP 可调用格式代替内联函数,例如
$comparator->whenDifferent(array($this, 'whenDifferent'));
文档
whenEqual
- 当在两个数组中都找到两个相等的项时调用
$comparator->whenEqual(function ($item1, $item2) { });
whenDifferent
- 当在两个数组中都找到两个不同的项时调用
$comparator->whenDifferent(function ($item1, $item2) { });
whenMissingRight
- 当第一数组(左侧数组)中存在一个项,但不在第二个数组(右侧数组)中时调用
$comparator->whenMissingRight(function ($item1) { });
whenMissingLeft
- 当第二数组(右侧数组)中存在一个项,但不在第一数组(左侧数组)中时调用
$comparator->whenMissingLeft(function ($item2) { });
setItemIdentityComparator
- 覆盖默认的身份比较器,用于确定两个项是否代表同一事物
例如,可以用于比较项的 id
。
默认行为使用 ===
比较数组键。
$comparator->setItemIdentityComparator(function ($key1, $key2, $item1, $item2) { // return true or false });
setItemComparator
- 覆盖默认的项比较器,以确定两个项(代表同一事物)是否存在差异
例如,可以用于比较项的特定属性。函数应返回“相等”,即 true
如果项没有差异(那么什么也不做,因为一切都很好),或者 false
如果它们有差异(那么将调用 whenDifferent
)。
默认行为使用 ==
比较项。
$comparator->setItemComparator(function ($item1, $item2) { // return true or false });
自定义比较器
使用 setItemIdentityComparator
和 setItemComparator
的替代方法是编写自己的比较器类
class CustomComparator extends ArrayComparator { protected function areSame($key1, $key2, $item1, $item2) { // Your stuff return $item1->id === $item2->id; } protected function areEqual($item1, $item2) { // Your stuff return $item1->name === $item2->name; } }
安装
编辑您的 composer.json
文件以添加依赖项
{ "require": { "myclabs/array-comparator": "1.0.*" } }
ArrayComparator 已与 PHP 5.3 及更高版本进行了测试。
变更日志
- 1.0: 经过测试并在生产中使用后的稳定版本(与 0.3 无变化)
- 0.3: PHP 5.3 兼容性和支持所有 PHP 可调用类型
- 0.2: 允许扩展
ArrayComparator
类并编写自定义比较器 - 0.1: 第一个版本
贡献
使用 Composer 安装依赖项
composer install
TODO
- 优化数组遍历
- 改进文档?