rentalhost/vanilla-array-query

将数组元素提取到新的数组中,只包含查询到的键。

0.1.2 2021-04-24 23:46 UTC

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'
];