sg/h /comparable
提供Comparable和Comparator接口和方法,用于根据这些接口对对象进行排序和比较。
Requires
- php: >=5.4.0
Requires (Dev)
- phpunit/phpunit: 4.*
This package is not auto-updated.
Last update: 2024-09-14 17:31:53 UTC
README
此包,之前称为Comparator Tools,提供对具有Comparable接口的对象进行排序的功能,以及其他与对象比较相关的有用功能。使用这些工具,Comparable和Comparator接口可以像Java中那样使用。
要求
该包需要PHP 5.4或更高版本。2.x分支需要PHP 5.6或更高版本。
安装
通过Composer
$ composer require sgh/comparable
使用方法
为了使您的类具有可比较的功能,实现Comparable接口
use SGH\Comparable\Comparable;
class Foo implements Comparable
{
public function compareTo($object)
{
// if $this less than $object, return -1
// if $this equals $object, return 0
// if $this greater than $object, return 1
}
}
compareTo方法将使用另一个Foo实例作为参数调用,如果($this < $object)适用,则必须返回一个负整数值,如果($this > $object)适用,则必须返回一个正整数值,否则返回0(对象被认为是相等的)。请注意,非整数值将被转换为(int),因此0.5将被视为0。
要使用Comparable接口对对象进行排序或比较,可以使用SortFunctions和SetFunctions中的方法。
排序
use SGH\Comparable\SortFunctions;
SortFunctions::sort($arrayOfFoo);
SortFunctions::asort($arrayOfFoo);
SortFunctions::rsort($arrayOfFoo);
SortFunctions::arsort($arrayOfFoo);
SortFunctions::multisort($arrayOfFoo, $arbitraryArray, ...);
前四个方法的工作方式与相应的核心函数sort、asort、rsort和arsort类似。multisort在“排序多个数组”模式下工作,即第一个传递的数组使用Comparable接口进行排序,其他数组以相同的方式进行排序。
比较
use SGH\Comparable\SetFunctions;
$diff = SetFunctions::diff($arrayOfFoo1, $arrayOfFoo2, ...);
$diff = SetFunctions::diff_assoc($arrayOfFoo1, $arrayOfFoo2, ...);
$intersect = SetFunctions::intersect($arrayOfFoo1, $arrayOfFoo2, ...);
$intersect = SetFunctions::intersect_assoc($arrayOfFoo1, $arrayOfFoo2, ...);
$unique = SetFunctions::unique($arrayOfFoo);
这些方法的工作方式与相应的核心函数array_diff、array_diff_assoc、array_intersect、array_intersect_assoc和array_unique类似。如果$a->compareTo($b) == 0,则认为对象$a和$b相等。
比较器
也可以在比较器类中实现比较,以将其与要比较的对象分离。这样,可以为任何值实现比较。
use SGH\Comparable\Comparator;
class FooComparator implements Comparator
{
public function compare($object1, $object2)
{
// if $object1 less than $object2, return -1
// if $object1 equals $object2, return 0
// if $object1 greater than $object2, return 1
}
}
compare方法定义与compareTo方法类似,但传递两个对象作为参数。
要使用比较器,将其作为最后一个参数传递给SetFunctions和SortFunctions的任何方法。
use SGH\Comparable\SortFunctions;
use SGH\Comparable\SetFunctions;
SortFunctions::sort($arrayOfFoo, new FooComparator);
SortFunctions::asort($arrayOfFoo, new FooComparator);
SortFunctions::rsort($arrayOfFoo, new FooComparator);
SortFunctions::arsort($arrayOfFoo, new FooComparator);
SortFunctions::multisort($arrayOfFoo, $arbitraryArray, ..., new FooComparator);
$diff = SetFunctions::diff($arrayOfFoo1, $arrayOfFoo2, ..., new FooComparator);
$diff = SetFunctions::diff_assoc($arrayOfFoo1, $arrayOfFoo2, ..., new FooComparator);
$intersect = SetFunctions::intersect($arrayOfFoo1, $arrayOfFoo2, ..., new FooComparator);
$intersect = SetFunctions::intersect_assoc($arrayOfFoo1, $arrayOfFoo2, ..., new FooComparator);
$unique = SetFunctions::unique($arrayOfFoo, new FooComparator);
ObjectComparator
该包包含一个ObjectComparator,用于比较对象的相等性(即如果两个变量包含相同的实例)。它不提供有用的排序顺序,但可以与SetFunctions中的方法一起使用(核心函数如array_diff等无法比较对象,它们尝试将它们转换为字符串以进行比较)。
use SGH\Comparable\SetFunctions;
use SGH\Comparable\Comparator\ObjectComparator;
$diff = SetFunctions::diff($arrayOfObjects1, $arrayOfObjects2, new ObjectComparator);
// .. and so on
以下是一些快捷方法
SetFunctions::objectsDiff($arrayOfObjects1, $arrayOfObjects2);
SetFunctions::objectsIntersect($arrayOfObjects1, $arrayOfObjects2);
SetFunctions::objectsUnique($arrayOfObjects);
SortedIterator
您还可以对迭代器进行排序。由于迭代器的本质,这意味着它们将被迭代一次,然后您将获得一个包含所有结果的ArrayIterator,按顺序排序。要对迭代器进行排序,请像这样使用SortedIterator装饰它
use SGH\Comparable\SortFunctions;
$sortedIterator = SortFunctions::sortedIterator($iterator);
异常
默认比较器如果其中一个对象没有实现Comparable接口,则抛出ComparatorException。
鼓励您在compare()或compareTo()实现中抛出ComparatorException,如果对象不可比较。在大多数情况下,如果对象不是期望的类型,您应该这样做。
测试
$ phpunit
贡献
有关详细信息,请参阅CONTRIBUTING。
安全性
如果您发现任何安全问题,请通过电子邮件fschmengler@sgh-it.eu与我们联系,而不是使用问题跟踪器。
致谢
- 法比安·施门格勒(https://github.com/schmengler)
- 所有贡献者
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。