首页  >  文章  >  后端开发  >  用于关联数组的 PHP array_map – 快速提示

用于关联数组的 PHP array_map – 快速提示

Barbara Streisand
Barbara Streisand原创
2024-10-26 07:59:30517浏览

如果您在这里,您可能已经意识到 array_map 函数不允许在回调中访问数组键。处理关联数组(具有字符串键的数组)时,使用键而不是值非常有用。

我将向您展示该解决方案的用例以及我实现的新功能。

想要了解更多技术文章,您可以在 Linkedin 或 X 上关注我。

array_map 用例

PHP array_map 函数的一个常见实际用例是转换来自数据库查询或 API 响应的数据。例如,假设您有一个用户数据数组,并且您想要格式化用户的名称或从每个用户记录中提取特定的信息。

假设您有一个用户记录数组,每个记录都是一个关联数组,其中包含名字、姓氏和电子邮件等键:

// Array of user data (e.g., from a database query)
$users = [
    [
        'first_name' => 'John',
        'last_name' => 'Doe',
        'email' => 'john.doe@example.com'
    ],
    [
        'first_name' => 'Jane',
        'last_name' => 'Smith',
        'email' => 'jane.smith@example.com'
    ],
    [
        'first_name' => 'Bob',
        'last_name' => 'Johnson',
        'email' => 'bob.johnson@example.com'
    ]
];

场景一:提取信息

您可以轻松提取电子邮件地址列表以将通知发送至:

$emails = array_map(function($user) {
    return $user['email'];
}, $users);

// Result: ['john.doe@example.com', 'jane.smith@example.com', 'bob.johnson@example.com']

场景2:添加信息

您可以使用 array_map 函数根据用户对象的信息添加新字段:

// Using array_map to add the avatar field to each user
$result = array_map(function($user) {
    return array_merge(
        $user,
        [
            'avatar' => 'https://eu.ui-avatars.com/api/?background=ff7511&color=fff&name='.$user['first_name']
        ]
    );
}, $users);


// Output the result
var_dump($result);

关联数组的用例

我从 NoSQL 数据库中提取数据,以在我的产品仪表板上创建图表。我从 NoSQL 数据库收到的数据如下所示:

$data = [
    "2024-08-25" => ["doc_count" => 523, "score" => 0.2, "skipped" => 0],
    "2024-08-24" => ["doc_count" => 423, "score" => 0.2, "skipped" => 0],
    "2024-08-23" => ["doc_count" => 453, "score" => 0.2, "skipped" => 0],
    "2024-08-22" => ["doc_count" => 267, "score" => 0.2, "skipped" => 0],
    "2024-08-21" => ["doc_count" => 378, "score" => 0.2, "skipped" => 0],
    "2024-08-20" => ["doc_count" => 325, "score" => 0.2, "skipped" => 0],
    "2024-08-19" => ["doc_count" => 501, "score" => 0.2, "skipped" => 0],
];

由于用于可视化图表的 javascript 库,我需要将此数据转换为以下格式,以使前端开发人员的生活更轻松:

$result = [
    [
        "label" => "2024-08-25",
        "value" => 523
    ],
    [
        "label" => "2024-08-24",
        "value" => 423
    ],

    ...
];

但是要执行此转换,我需要访问原始数组的键以将其放入“标签”字段中。但默认的 array_map 函数只允许访问值。

这是使用关联数组的 array_map_assoc 函数的实现。它提供键和值作为回调的参数:

/**
 * Apply a mapping callback receiving key and value as arguments.
 * The standard array_map doesn't pass the key to the callback. But in the case of associative arrays,
 * it could be really helpful.
 *
 * array_map_assoc(function ($key, $value) {
 *  ...
 * }, $items)
 *
 * @param callable $callback
 * @param array $array
 * @return array
 */
function array_map_assoc(callable $callback, array $array): array
{
    return array_map(function($key) use ($callback, $array){
        return $callback($key, $array[$key]);
    }, array_keys($array));
}

现在我可以将原始用户数组转换为 javascript 图表库的数据格式:

$histogram = array_map_assoc(function ($key, $value) {
    return [
        'label' => $key,
        'value' => $value['doc_count']
    ];
}, $data);

笔记

要小心,因为 array_map_assoc 函数不会保留字符串键的状态,但它会生成一个全新的标准数组。

我还将此函数作为新的辅助函数添加到了 Laravel 应用程序的全局命名空间中:

https://inspector.dev/laravel-custom-helper-functions-fast-tips/

为什么不使用foreach?

更有经验的开发人员可能会认为只需使用 foreach 语句即可访问键和值:

foreach ($data as $date => $value) {
    ...
}

使用 foreach 时,您必须使用附加变量来保存结果转换,并且无法在“一行”语句中构建代码。

// Array of user data (e.g., from a database query)
$users = [
    [
        'first_name' => 'John',
        'last_name' => 'Doe',
        'email' => 'john.doe@example.com'
    ],
    [
        'first_name' => 'Jane',
        'last_name' => 'Smith',
        'email' => 'jane.smith@example.com'
    ],
    [
        'first_name' => 'Bob',
        'last_name' => 'Johnson',
        'email' => 'bob.johnson@example.com'
    ]
];

想要了解更多技术文章,您可以在 Linkedin 或 X 上关注我。

免费监控您的 PHP 应用程序

Inspector是一款专为软件开发人员设计的代码执行监控工具。您无需在服务器级别安装任何内容,只需安装 LaravelSymfony 软件包即可开始使用。

如果您正在寻找 HTTP 监控、数据库查询见解以及将警报和通知转发到您首选消息传递环境的能力,请免费尝试 Inspector。注册您的帐户。

或在网站上了解更多信息:https://inspector.dev

PHP array_map for associative array – Fast Tips

以上是用于关联数组的 PHP array_map – 快速提示的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn