php - 一个数组中的两个单独的 API 调用值

标签 php arrays laravel

情况

我有两个 API 调用,一个用于获取所有设备,一个用于获取所有组。我想要完成的是进行一次调用,以获取组及其设备。

这是获取设备的函数

public function getAll($environment, $options)
{
    // Get group ids from database, used for pairing groups with environments
    $groups = Device::where('source_id', $options['deviceSourceId'])->get();
    $groupIds = [];
    foreach ($groups as $group) {
        $groupIds[] = $group['group_id'];
    }

    // Parameters
    $apiparams = [
        'headers' => $this->getHeaders($environment)
    ];

    $devices = [];

    foreach($groupIds as $groupId)
    {
        $responseAPI = $this->getClient()->request('GET', 'devices?groupid=' . $groupId, $apiparams);
        $responseAPI = json_decode($responseAPI->getBody()->getContents(), true);
        $devices[] = $responseAPI['devices'];
    }

    return $devices;
}

这是获取组的函数

public function getGroups($environment, $options)
{
    // Get group ids from database, used for pairing groups with environments
    $groups = Device::where('source_id', $options['deviceSourceId'])->get();
    $groupIds = [];
    foreach ($groups as $group) {
        $groupIds[] = $group['group_id'];
    }

    // Parameters
    $apiparams = [
        'headers' => $this->getHeaders($environment)
    ];

    $groups2 = [];

    foreach($groupIds as $groupId)
    {
        $responseAPI = $this->getClient()->request('GET', 'groups/' . $groupId, $apiparams);
        $responseAPI = json_decode($responseAPI->getBody()->getContents(), true);

        $groups2[] = $responseAPI;
    }
    return $groups2;
}

当前响应

这是我从这些人那里得到的回应。

// Device response
[
    {
        "remotecontrol_id": "r5674567"
        "device_id": "d871212",
        "alias": "PC-01",
        "groupid": "g9873491",
        "online_state": "Online",
        "assigned_to": false
    },
    {
        "remotecontrol_id": "r8370129"
        "device_id": "d091231",
        "alias": "PC-02",
        "groupid": "g9873491",
        "online_state": "Offline",
        "assigned_to": false
    }
]

// Group response
{
    "id": "g9873491"
    "name": "companyname",
    "permissions": "owned"
}

需要回复

我希望得到的回应是:

[{id: "g9873491",
  name: "companyname",
  devices: [{device_id: "d871212",
             alias: "PC-01",
             online_state: "Online"},
            {device_id: "d091231",
             alias: "PC-02",
             online_state: "Offline"}
            }],
}]

我需要怎么做?

重要编辑

public function getAll($environment, $options)
{
    // Get group ids from database, used for pairing groups with environments
    $groups = Device::where('source_id', $options['deviceSourceId'])->get();
    $groupIds = [];
    foreach ($groups as $group) {
        $groupIds[] = $group['group_id'];
    }

    // Parameters
    $apiparams = [
        'headers' => $this->getHeaders($environment)
    ];

    foreach($groupIds as $groupId)
    {

        $responseAPI1 = $this->getClient()->request('GET', 'groups/' . $groupId, $apiparams);
        $responseAPI2 = $this->getClient()->request('GET', 'devices?groupid=' . $groupId, $apiparams);

        $groups2 = json_decode($responseAPI1->getBody()->getContents(), true);
        $devices = json_decode($responseAPI2->getBody()->getContents(), true);

        $result = array_values(array_reduce(
            $devices,
            function ($carry, $device) {
                if (isset($carry[$device['groupid']])) { // Undefined index: groupid
                    // Add device to group.
                    $carry[$device['groupid']]['devices'][] = [
                        'device_id' => $device['device_id'],
                        'alias' => $device['alias'],
                        'online_state' => $device['online_state']
                    ];
                }

                return $carry;
            },
            // Reindex groups by id.
            array_column($groups2, null, 'id')
        ));
    }

    return $result;
}

最佳答案

如果您无法控制 API,我想您无法减少调用次数,因为您只有 API 本身定义的调用。因此,一种解决方案是自己准备所需格式的响应。您可以执行以下操作:

$devices = json_decode($devices, true);
$groups = json_decode($groups, true);

$result = array_values(array_reduce(
    $devices,
    function ($carry, $device) {
        if (isset($carry[$device['groupid']])) {
            // Add device to group.
            $carry[$device['groupid']]['devices'][] = [
                'device_id' => $device['device_id'],
                'alias' => $device['alias'],
                'online_state' => $device['online_state']
            ];
        }

        return $carry;
    },
    // Reindex groups by id.
    array_column($groups, null, 'id')
));

这里是 the demo .

当您使用 Laravel 时,另一种方法是利用 Laravel Collections .但在这种特殊情况下,我想,除非您是集合大师(并从头到尾阅读 "Refactoring to Collections":))否则普通的 PHP 数组函数更容易理解和使用。

关于php - 一个数组中的两个单独的 API 调用值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49295953/

相关文章:

php - 访问paypal支付时http响应码500

python - 在 python 中,如何将数组/列表与数字进行比较

php - 删除数组中的第一级标识符

javascript - 数据库驱动的内容和语言环境

javascript - 从 Laravel 设置 cookie 并从 javascript 获取 null

php - 如何在 laravel 的自定义请求类中传递消息?

php - 无法通过引用传递参数 - MySQLi

javascript - 无法在 javascript 脚本标记内输出实际的 json 数据

PHP 一对多 MySQL 关系

php - 使用 PHP 和 jQuery 预加载图像 - 逗号分隔数组?