rentalhost / vanilla-array-query
将数组元素提取到新的数组中,只包含查询到的键。
Requires
- php: >=7.3
Requires (Dev)
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-25 08:21:51 UTC
README
从数组中提取值的一种简单方法。
现实世界:有时在某个上下文中需要处理包含大量无关信息的数组,这可能会成为一个问题。ArrayQuery 包可以以简单的方式简化返回结果,即使是多维数组。
安装
使用 Composer
$ composer require rentalhost/vanilla-array-query
{ "require": { "rentalhost/vanilla-array-query": "^0.1" } }
require 'vendor/autoload.php'; use Rentalhost\Vanilla\ArrayQuery\ArrayQuery; ArrayQuery::query( [ 'name' => 'John Doe', 'age' => 30 ], [ 'age' ] ) === [ 'age' => 30 ];
用法
简单提取
如上例所示,只需指定要从源数组中提取的键,就可以轻松提取信息。
假设我们有一个包含页面信息的数组,但我们只想提取其路由和标题,而其他所有信息在当前时刻都是无关的。
输出将只从第一个参数(源数组)中捕获由第二个参数(查询数组)指示的键,按请求的顺序。
$page = [ 'route' => '/home', 'title' => 'Home', 'description' => 'Initial page', ]; ArrayQuery::query($page, [ 'route', 'title' ]) === [ 'route' => '/home', 'title' => 'Home', ];
二维提取
还可以简单地从二维数组中提取信息。
在这种情况下,查询键将表示要从源中提取的键,其数组值将表示要从第二维中提取的键。
假设我们有一个包含页面信息的二维数组,我们只想提取与其相关的某些信息,同时保留源数组的原始结构。
$page = [ 'header' => [ 'title' => 'Home', 'description' => 'Initial page', ], ]; ArrayQuery::query($page, [ 'header' => [ 'title' ] ]) === [ 'header' => [ 'title' => 'Home', ], ];
多维提取
更进一步,我们甚至可以从多维源中提取信息。
在这种情况下,我们传递一个包含数组数组的查询,并在其键中指示我们想要提取的信息。
假设我们有一个包含多个页面信息的数组,但我们只对获得其路由感兴趣。
$pages = [ [ 'route' => '/home', 'title' => 'Home', ], [ 'route' => '/admin', 'title' => 'Administrative', ], ]; ArrayQuery::query($pages, [ [ 'route' ] ]) === [ [ 'route' => '/home', ], [ 'route' => '/admin', ], ];
自定义提取
有时,源数组在多维上过于复杂,有时您需要简化输出以便更容易处理。
例如,假设您有一个页面,您唯一感兴趣的是标题。但是标题在包含大量您在上下文中不需要的信息的header键中。
在这种情况下,您可以输入一个自定义键,其值为一个函数。此函数将接收该级别的所有现有信息,其返回值将是该新键的输出。
在下面的示例中,请注意,源数组没有标题键,但我们将从header键中的标题键内部现有的值动态创建它。
$page = [ 'header' => [ 'title' => 'Home', 'description' => 'Initial page' ] ]; ArrayQuery::query($page, [ 'title' => static function (array $page) { return $page['header']['title']; } ]) === [ 'title' => 'Home', ];
此功能还允许您转换现有键,例如过滤其元素。
假设,然后,我们有一个具有简化路由的页面,但我们想将其转换为绝对路径。键将保留为路由,但其值将改变。
重要的是要记住,可调用函数将接收该上下文(在这种情况下是 $page
)的整个数组,而不仅仅是您重新分配的键的值。
$page = [ 'route' => '/home' ]; ArrayQuery::query($page, [ 'route' => static function (array $page) { return 'https://...' . $page['route']; } ]) === [ 'route' => 'https://.../home', ];
高级提取
最后,可以通过可调用作为值创建键来执行高级值提取,但不需要键。
可调用必须返回一个数组,其中包含将应用于源数组的键。
那么,假设我们有几个页面,并且我们希望使用自己的路由作为键,标题作为值。
$pages = [ [ 'route' => '/home', 'title' => 'Home' ], [ 'route' => '/admin', 'title' => 'Administrative' ], ]; ArrayQuery::query($pages, [ static function (array $page) { return array_combine( array_column($page, 'route'), array_column($page, 'title'), ); } ]) === [ '/home' => 'Home', '/admin' => 'Administrative' ];