sg/h/comparable

提供Comparable和Comparator接口和方法,用于根据这些接口对对象进行排序和比较。

v1.1.1 2015-04-06 10:41 UTC

This package is not auto-updated.

Last update: 2024-09-14 17:31:53 UTC


README

Author Latest Version Software License Build Status

此包,之前称为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与我们联系,而不是使用问题跟踪器。

致谢

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件