myclabs/array-comparator

数组比较器

1.1.0 2014-08-04 11:36 UTC

This package is not auto-updated.

Last update: 2024-09-12 14:57:36 UTC


README

数组比较辅助工具。

Latest Stable Version Build Status Coverage Status

原则

以下是默认行为

默认情况下,比较数组键。此行为可以自定义。

用法

$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
});

自定义比较器

使用 setItemIdentityComparatorsetItemComparator 的替代方法是编写自己的比较器类

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

  • 优化数组遍历
  • 改进文档?