首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按两个字段分组php数组

按两个字段分组php数组
EN

Stack Overflow用户
提问于 2021-08-03 08:51:31
回答 1查看 46关注 0票数 1

我正在寻找一种方法来创建一个单一的数组结果后,它过滤对象的service字段和type字段和和taskCountusageTime字段。

这是我要分组的数组:

代码语言:javascript
复制
        [
            ["service" => "creatives", "type" => "HTMLToImage", "taskCount" => 418, "usageTime" => 7860],
            ["service" => "displayads", "type" => "html5", "taskCount" => 147, "usageTime" => 3865],
            ["service" => "creatives", "type" => "HTMLToVideo", "taskCount" => 543, "usageTime" => 8549],
            ["service" => "displayads", "type" => "html5", "taskCount" => 321, "usageTime" => 5423]
        ];

到目前为止,我已经尝试过这种方法:

代码语言:javascript
复制
            $myArr = array_reduce($myArr, function($carry, $item) { 
                if(!isset($carry[$item->service])) {
                    $carry[$item->service] = $item;
                } else {
                    $carry[$item->service]->taskCount += $item->taskCount;
                    $carry[$item->service]->totalDuration += $item->totalDuration;
                }
                return $carry;
            });
            
            $myArr = array_values($myArr);

结果:

代码语言:javascript
复制
        [
            ["service" => "creatives", "type" => "HTMLToImage", "taskCount" => 961, "usageTime" => 16403],
            ["service" => "displayads", "type" => "html5", "taskCount" => 468, "usageTime" => 9288]
        ];

正如您可以看到的那样,HTMLtoImage类型使用了"type" => "HTMLToVideo" ...

预期结果:

代码语言:javascript
复制
        [
            ["service" => "creatives", "type" => "HTMLToImage", "taskCount" => 418, "usageTime" => 7860],
            ["service" => "creatives", "type" => "HTMLToVideo", "taskCount" => 961, "usageTime" => 8549],
            ["service" => "displayads", "type" => "html5", "taskCount" => 468, "usageTime" => 9288]
        ];

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-03 09:32:00

您的问题是,您只是使用服务来组合结果。您可以通过将两个键组合为一个键来解决此问题:

代码语言:javascript
复制
$item->service . $item->type

因此,您的答案可以是:

代码语言:javascript
复制
$myArr = array_reduce($myArr, function($carry, $item) {  
    $compoundKey = $item->service . '/' . $item->type;
    if(!isset($carry[$compoundKey])) {
        $carry[$compoundKey] = $item;
    } else {
        $carry[$compoundKey]->taskCount += $item->taskCount;
        $carry[$compoundKey]->totalDuration += $item->totalDuration;
    }
    
    return $carry;
});
        
$myArr = array_values($myArr);

我会把'/‘或类似的东西放在键中,以防你不得不调试。另外,如果任何部分都有可能为空,则需要防止(??'')在这种情况下,我还会添加一个分隔符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68633004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档