samsonasik / array-lookup
一个快速的查找库,帮助您验证和搜索数组和可遍历数据
1.8.0
2024-09-07 16:37 UTC
Requires
- php: ^8.1
- webmozart/assert: ^1.11
Requires (Dev)
- laminas/laminas-coding-standard: ^2.4
- phpstan/phpstan: ^1.9
- phpstan/phpstan-webmozart-assert: ^1.2
- phpunit/phpunit: ^10.0
- rector/rector: dev-main
README
介绍
ArrayLookup 是一个快速的查找库,帮助您验证和搜索 array
和 Traversable
数据。
功能
- 至少验证次数:
once()
、twice()
、times()
- 精确验证次数:
once()
、twice()
、times()
- 搜索数据:
first()
、last()
、rows()
- 使用过滤和转换收集数据
安装
使用此库需要 composer。
composer require samsonasik/array-lookup
用法
A. AtLeast
1. AtLeast::once()
验证数据至少已过滤找到一次项目。
use ArrayLookup\AtLeast; $data = [1, 2, 3]; $filter = static fn($datum): bool => $datum === 1; var_dump(AtLeast::once($data, $filter)) // true $data = [1, 2, 3]; $filter = static fn($datum): bool => $datum === 4; var_dump(AtLeast::once($data, $filter)) // false // WITH key array included, pass $key variable as 2nd arg on filter to be used in filter $data = [1, 2, 3]; $filter = static fn($datum, $key): bool => $datum === 1 && $key >= 0; var_dump(AtLeast::once($data, $filter)) // true $data = [1, 2, 3]; $filter = static fn($datum, $key): bool => $datum === 4 && $key >= 0; var_dump(AtLeast::once($data, $filter)) // false
2. AtLeast::twice()
验证数据至少已过滤找到两次项目。
use ArrayLookup\AtLeast; $data = [1, "1", 3]; $filter = static fn($datum): bool => $datum == 1; var_dump(AtLeast::twice($data, $filter)) // true $data = [1, "1", 3]; $filter = static fn($datum): bool => $datum === 1; var_dump(AtLeast::twice($data, $filter)) // false // WITH key array included, pass $key variable as 2nd arg on filter to be used in filter $data = [1, "1", 3]; $filter = static fn($datum, $key): bool => $datum == 1 && $key >= 0; var_dump(AtLeast::twice($data, $filter)) // true $data = [1, "1", 3]; $filter = static fn($datum, $key): bool => $datum === 1 && $key >= 0; var_dump(AtLeast::twice($data, $filter)) // false
3. AtLeast::times()
验证数据至少已过滤找到与第三个参数传入次数相同次数的项目。
use ArrayLookup\AtLeast; $data = [false, null, 0]; $filter = static fn($datum): bool => ! $datum; $times = 3; var_dump(AtLeast::times($data, $filter, $times)) // true $data = [1, null, 0]; $filter = static fn($datum): bool => ! $datum; $times = 3; var_dump(AtLeast::times($data, $filter, $times)) // false // WITH key array included, pass $key variable as 2nd arg on filter to be used in filter $data = [false, null, 0]; $filter = static fn($datum, $key): bool => ! $datum && $key >= 0; $times = 3; var_dump(AtLeast::times($data, $filter, $times)) // true $data = [1, null, 0]; $filter = static fn($datum, $key): bool => ! $datum && $key >= 0; $times = 3; var_dump(AtLeast::times($data, $filter, $times)) // false
B. Only
1. Only::once()
验证数据恰好只找到一次已过滤的项目。
use ArrayLookup\Only; $data = [1, 2, 3]; $filter = static fn($datum): bool => $datum === 1; var_dump(Only::once($data, $filter)) // true $data = [1, "1", 3] $filter = static fn($datum): bool => $datum == 1; var_dump(Only::once($data, $filter)) // false // WITH key array included, pass $key variable as 2nd arg on filter to be used in filter $data = [1, 2, 3]; $filter = static fn($datum, $key): bool => $datum === 1 && $key >= 0; var_dump(Only::once($data, $filter)) // true $data = [1, "1", 3] $filter = static fn($datum, $key): bool => $datum == 1 && $key >= 0; var_dump(Only::once($data, $filter)) // false
2. Only::twice()
验证数据恰好只找到两次已过滤的项目。
use ArrayLookup\Only; $data = [1, "1", 3]; $filter = static fn($datum): bool => $datum == 1; var_dump(Only::twice($data, $filter)) // true $data = [true, 1, new stdClass()]; $filter = static fn($datum): bool => (bool) $datum; var_dump(Only::twice($data, $filter)) // false // WITH key array included, pass $key variable as 2nd arg on filter to be used in filter $data = [1, "1", 3]; $filter = static fn($datum, $key): bool => $datum == 1 && $key >= 0; var_dump(Only::twice($data, $filter)) // true $data = [true, 1, new stdClass()]; $filter = static fn($datum, $key): bool => (bool) $datum && $key >= 0; var_dump(Only::twice($data, $filter)) // false
3. Only::times()
验证数据恰好只找到与第三个参数传入次数相同的已过滤项目。
use ArrayLookup\Only; $data = [false, null, 1]; $filter = static fn($datum): bool => ! $datum; $times = 2; var_dump(Only::times($data, $filter, $times)) // true $data = [false, null, 0]; $filter = static fn($datum): bool => ! $datum; $times = 2; var_dump(Only::times($data, $filter, $times)) // false // WITH key array included, pass $key variable as 2nd arg on filter to be used in filter $data = [false, null, 1]; $filter = static fn($datum, $key): bool => ! $datum && $key >= 0; $times = 2; var_dump(Only::times($data, $filter, $times)) // true $data = [false, null, 0]; $filter = static fn($datum, $key): bool => ! $datum && $key >= 0; $times = 2; var_dump(Only::times($data, $filter, $times)) // false
3. Finder
1. Finder::first()
搜索第一个已过滤的数据。
use ArrayLookup\Finder; $data = [1, 2, 3]; $filter = static fn($datum): bool => $datum === 1; var_dump(Finder::first($data, $filter)) // 1 $filter = static fn($datum): bool => $datum == 1000; var_dump(Finder::first($data, $filter)) // null // RETURN the Array key, pass true to 3rd arg $filter = static fn($datum): bool => $datum === 1; var_dump(Finder::first($data, $filter, true)) // 0 $filter = static fn($datum): bool => $datum == 1000; var_dump(Finder::first($data, $filter, true)) // null // WITH key array included, pass $key variable as 2nd arg on filter to be used in filter $filter = static fn($datum, $key): bool => $datum === 1 && $key >= 0; var_dump(Finder::first($data, $filter)) // 1 $filter = static fn($datum, $key): bool => $datum == 1000 && $key >= 0; var_dump(Finder::first($data, $filter)) // null
2. Finder::last()
搜索最后一个已过滤的数据。
use ArrayLookup\Finder; $data = [6, 7, 8, 9]; var_dump(Finder::last( $data, static fn ($datum): bool => $datum > 5 )); // 9 var_dump(Finder::last( $data, static fn ($datum): bool => $datum < 5 )); // null // RETURN the Array key, pass true to 3rd arg // ... with PRESERVE original key var_dump(Finder::last( $data, static fn ($datum): bool => $datum > 5, true )); // 3 // ... with RESORT key, first key is last record var_dump(Finder::last( $data, static fn ($datum): bool => $datum > 5, true, false )); // 0 var_dump(Finder::last( $data, static fn ($datum): bool => $datum < 5, true )); // null // WITH key array included, pass $key variable as 2nd arg on filter to be used in filter var_dump(Finder::last( $data, static fn ($datum, $key): bool => $datum > 5 && $key >= 0 )); // 9 var_dump(Finder::last( $data, static fn ($datum, $key): bool => $datum < 5 && $key >= 0 )); // null
3. Finder::rows()
获取已过滤的行数据。
use ArrayLookup\Finder; $data = [6, 7, 8, 9]; var_dump(Finder::rows( $data, static fn($datum): bool => $datum > 6 )); // [7, 8, 9] var_dump(Finder::rows( $data, static fn ($datum): bool => $datum < 5 )); // [] // ... with PRESERVE original key var_dump(Finder::rows( $data, static fn ($datum): bool => $datum > 6, true )); // [1 => 7, 2 => 8, 3 => 9] var_dump(Finder::rows( $data, static fn ($datum): bool => $datum < 5, true )); // [] // WITH key array included, pass $key variable as 2nd arg on filter to be used in filter var_dump(Finder::rows( $data, static fn($datum, $key): bool => $datum > 6 && $key > 1 )); // [8, 9] // WITH gather only limited found data $data = [1, 2]; $filter = static fn($datum): bool => $datum >= 0; $limit = 1; var_dump( Finder::rows($data, $filter, limit: $limit) ); // [1]
4. Collector
收集过滤数据,每个找到的数据都有新的转换
之前
$newArray = []; foreach ($data as $datum) { if (is_string($datum)) { $newArray[] = trim($datum); } }
之后
use ArrayLookup\Collector; $when = fn ($datum): bool => is_string($datum); $limit = 2; $transform = fn ($datum): string => trim($datum); $newArray = Collector::setUp($data) ->when($when) // optional, can just transform without filtering ->withLimit(2) // optional to only collect some data provided by limit config ->withTransform($transform) ->getResults();