arraypress / comparator
一个高级PHP比较库,支持自定义函数、类型检测、正则表达式和JSON字符串处理,适用于WordPress和PHP项目。
Requires
- php: ^7.4 || ^8.0
- ext-json: *
This package is auto-updated.
Last update: 2024-09-19 01:02:06 UTC
README
Comparator库提供了一种灵活而强大的方法来在PHP中比较值,支持多种数据类型和比较运算符。它旨在易于使用,同时提供广泛的复杂比较场景的功能。
特性
- 支持多种数据类型:字符串、浮点数、整数、布尔值、数组、对象和JSON。
- 可自定义比较行为,包括大小写敏感性和浮点数的epsilon。
- 广泛的比较运算符集合,包括数学比较、正则表达式匹配、字符串包含和自定义比较函数。
- 允许进行严格和宽松的比较。
- 可配置数组比较的匹配类型,以要求所有或任何元素匹配。
安装
确保您的项目已安装此包。如果没有,通常可以使用Composer包含它。
composer require arraypress/comparator
全局比较函数
该库提供了一个方便的全局Compare
类,便于在两个值之间进行广泛定制的比较。此函数内部利用Comparator
类,同时提供额外的灵活性和自定义比较逻辑以及错误处理。
函数签名
Compare::values( $value1, $value2, string $operator, ?string $type = null, bool $caseSensitive = true, bool $useEpsilon = false, $value3 = null, ?callable $customFunction = null, float $epsilon = 1.0e-10, ?callable $errorCallback = null ): ?bool
参数
$value1
、$value2
:要比较的值。$operator
:定义值应该如何比较。请参阅运算符表以获取支持的运算符。$type
:指定比较类型。如果为null
,则自动检测类型。$caseSensitive
:确定字符串比较是否区分大小写。默认为true
。$useEpsilon
:使用epsilon进行浮点数比较以处理精度问题。$value3
:BETWEEN比较的上限。$customFunction
:用于比较的自定义函数,当运算符设置为'custom'时使用。$epsilon
:浮点数比较的容差级别。默认为1.0e-10。$errorCallback
:错误处理回调,在比较期间发生异常时调用。
返回值
返回一个布尔值,表示比较的结果,或在发生错误时返回null
。
使用示例
$result = Compare::values( 'hello', 'Hello', '=', false ); // Case-insensitive string comparison if ( $result ) { // Values are considered equal }
此函数通过抽象Comparator
类的实例化和设置,简化了复杂的比较,允许开发人员以最少的设置进行比较,并优雅地处理错误。
支持的比较运算符及其别名
Comparator
类通过支持广泛的比较运算符提供了一种灵活的方法来比较不同类型的值。为了使类更直观且用户友好,它允许使用人类可读的别名来表示这些运算符。以下是映射这些别名到它们相应的标准运算符符号的表,为用户提供了一个易于参考的比较表达式构建指南。
更新translateOperator函数您已经在translateOperator函数中包含了必要的更新
此功能增强了代码的可读性和表达性,使其更容易理解和维护。
自动类型检测
Comparator
类配备了智能自动类型检测系统,旨在简化不同类型值之间的比较过程。此功能自动识别提供值的类型,并根据其类型应用最合适的比较逻辑。下表解释了可以自动检测的类型以及每种类型被识别的条件。
这种自动类型检测简化了更动态和容错性更强的比较过程,使用户能够在无需显式类型转换或手动类型检查的情况下比较不同类型的数据。它确保比较逻辑始终与正在比较的数据的性质保持一致,增强了Comparator
类的鲁棒性和通用性。
示例测试1:整数比较
比较两个整数以检查第一个是否小于第二个。
$result = Compare::values( 5, 10, '<' ) ? 'Pass' : 'Fail'; // Expected output: Pass
示例测试2:带有Epsilon的浮点比较
比较两个浮点数是否相等,考虑一个小范围(epsilon)。
$result = Compare::values( 0.1 + 0.2, 0.3, '=', 'float', true, true ) ? 'Pass' : 'Fail'; // Expected output: Pass
示例测试3:字符串区分大小写的比较
区分大小写地比较两个字符串。
$result = Compare::values( 'Hello', 'hello', '=', 'string', true ) ? 'Pass' : 'Fail'; // Expected output: Fail (due to case sensitivity)
示例测试4:自定义函数比较
使用自定义函数进行比较。在这个例子中,检查第一个数是否是第二个数的两倍。
$customFunction = function ( $a, $b ) { return $a == ( $b * 2 ); }; $result = Compare::values( 10, 5, 'custom', null, true, false, 'all', $customFunction ) ? 'Pass' : 'Fail'; // Expected output: Pass
示例测试5:JSON字符串比较
比较两个JSON字符串是否相等。
$json1 = '{"name": "John", "age": 30}'; $json2 = '{"name": "John", "age": 30}'; $result = Compare::values( $json1, $json2, '=' ) ? 'Pass' : 'Fail'; // Expected output: Pass
示例测试6:正则表达式比较
使用正则表达式来比较字符串是否与模式匹配。
$result = Compare::values( 'test123', '^test', 'regex' ) ? 'Pass' : 'Fail'; // Expected output: Pass
示例测试7:数组比较
比较两个数组是否相等。
$array1 = [1, 2, 3]; $array2 = [1, 2, 3]; $result = Compare::values( $array1, $array2, '=' ) ? 'Pass' : 'Fail'; // Expected output: Pass
示例测试8:布尔比较
比较两个布尔值是否相等。
$result = Compare::values( true, true, '=', 'bool' ) ? 'Pass' : 'Fail'; // Expected output: Pass
示例测试9:对象比较
比较两个对象是否相等。
$obj1 = (object) [ 'key' => 'value' ]; $obj2 = (object) [ 'key' => 'value' ]; $result = Compare::values( $obj1, $obj2, '=', 'object' ) ? 'Pass' : 'Fail'; // Expected output: Pass
示例测试10:日期比较
比较两个日期以检查第一个是否小于第二个。
$result = Compare::values( '2023-01-01', '2024-01-01', '<' ) ? 'Pass' : 'Fail'; // Expected output: Pass
示例测试11:字符串包含
检查一个字符串是否包含另一个字符串。
$result = Compare::values( 'Hello world', 'world', 'contains' ) ? 'Pass' : 'Fail'; // Expected output: Fail
示例测试12:字符串以...开头
检查一个字符串是否以另一个字符串开头。
$result = Compare::values( 'Hello world', 'Hello', 'starts' ) ? 'Pass' : 'Fail'; // Expected output: Pass
示例测试13:字符串以...结尾
检查一个字符串是否以另一个字符串结尾。
$result = Compare::values( 'Hello world', 'world', 'ends' ) ? 'Pass' : 'Fail'; // Expected output: Pass
示例测试14:不等比较
比较两个整数以检查它们是否不相等。
$result = Compare::values( 5, 10, '!=' ) ? 'Pass' : 'Fail'; // Expected output: Pass
示例测试15:大于比较
比较两个整数以检查第一个是否大于第二个。
$result = Compare::values( 10, 5, '>' ) ? 'Pass' : 'Fail'; // Expected output: Pass
示例测试16:数字之间的比较
检查一个整数是否在两个其他整数之间(包含)。
$result = Compare::between( 15, 10, 20 ) ? 'Pass' : 'Fail'; // Expected output: Pass
示例测试17:数字不在之间的比较
检查一个整数是否不在两个其他整数之间(包含)。
$result = Compare::notBetween( 5, 10, 20 ) ? 'Pass' : 'Fail'; // Expected output: Pass
示例测试18:日期之间的比较
检查一个日期是否在两个其他日期之间。
$dateToCheck = '2023-06-15'; $startDate = '2023-06-01'; $endDate = '2023-06-30'; $result = Compare::between( $dateToCheck, $startDate, $endDate, 'date' ) ? 'Pass' : 'Fail'; // Expected output: Pass
示例测试19:日期不在之间的比较
检查一个日期是否不在两个其他日期之间。
$dateToCheck = '2023-07-01'; $startDate = '2023-06-01'; $endDate = '2023-06-30'; $result = Compare::notBetween( $dateToCheck, $startDate, $endDate, 'date' ) ? 'Pass' : 'Fail'; // Expected output: Pass
贡献
对这个库的贡献非常受赞赏。在GitHub上提出问题或提交用于修复错误或添加新功能的拉取请求。分享改进的建议和反馈。
许可证:GPLv2或更高版本
本程序是自由软件;您可以在自由软件基金会发布的GNU通用公共许可证的条款下重新分发和/或修改它;许可证的第2版,或(根据您的选择)任何更高版本。
本程序的分发是希望它会有用,但没有任何保证;甚至没有关于适销性或适用于特定目的的隐含保证。有关详细信息,请参阅GNU通用公共许可证。