我正在寻找一种方法来创建一个单一的数组结果后,它过滤对象的service字段和type字段和和taskCount和usageTime字段。
这是我要分组的数组:
[
["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]
];到目前为止,我已经尝试过这种方法:
$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);结果:
[
["service" => "creatives", "type" => "HTMLToImage", "taskCount" => 961, "usageTime" => 16403],
["service" => "displayads", "type" => "html5", "taskCount" => 468, "usageTime" => 9288]
];正如您可以看到的那样,HTMLtoImage类型使用了"type" => "HTMLToVideo" ...
预期结果:
[
["service" => "creatives", "type" => "HTMLToImage", "taskCount" => 418, "usageTime" => 7860],
["service" => "creatives", "type" => "HTMLToVideo", "taskCount" => 961, "usageTime" => 8549],
["service" => "displayads", "type" => "html5", "taskCount" => 468, "usageTime" => 9288]
];谢谢。
发布于 2021-08-03 09:32:00
您的问题是,您只是使用服务来组合结果。您可以通过将两个键组合为一个键来解决此问题:
$item->service . $item->type因此,您的答案可以是:
$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);我会把'/‘或类似的东西放在键中,以防你不得不调试。另外,如果任何部分都有可能为空,则需要防止(??'')在这种情况下,我还会添加一个分隔符。
https://stackoverflow.com/questions/68633004
复制相似问题