首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于另一值php的foreach循环中的和值

基于另一值php的foreach循环中的和值
EN

Stack Overflow用户
提问于 2022-02-17 14:43:56
回答 3查看 48关注 0票数 0

我有一个像下面这样的数组。数组中有id、标签、成本和cid。我们要对基于cid的成本进行求和,cid 22的成本应该是196.5,cid 11的成本应该是44.4。在我们的输出数组中,我们希望保留标签、成本(和)和cid,请查看预期的输出数组。

代码语言:javascript
复制
Array
(
    [0] => Array
        (
            [id] => 1331
            [label] => PM1
            [cost] => 98.25
            [cid] => 22
            [product_id] => 133
        )

    [1] => Array
        (
            [id] => 1332
            [label] => PM3
            [cost] => 22.20
            [cid] => 11
            [product_id] => 133
        )

    [2] => Array
        (
            [id] => 1341
            [label] => PM1
            [cost] => 98.25
            [cid] => 22
            [product_id] => 134
        )

    [3] => Array
        (
            [id] => 1342
            [label] => PM3
            [cost] => 22.20
            [cid] => 11
            [product_id] => 134
        )

)

试在下面

代码语言:javascript
复制
foreach ($array $key => $value) {

                         $final[$value['cid']] += $value['cost'];
                        } 

                       print_r ($final);

以输出的形式低于

代码语言:javascript
复制
Array
(
    [22] => 196.5
    [11] => 44.4
)

希望预期的输出如下所示。

代码语言:javascript
复制
Array
    (
        [22] =>  Array
           (
            [label] => PM1
            [cost] => 196.5
            [cid] => 22
           )
        [11] => Array
           (
            [label] => PM3
            [cost] => 44.4
            [cid] => 11
           )
    )

基本上想要在cid的基础上对成本进行求和,并且要保留标签、成本( sum )和cid。

任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-02-17 15:13:05

代码语言:javascript
复制
$list = [
    [ 'id' => 1331, 'label' => 'PM1', 'cost' => 98.25, 'cid' => 22, 'product_id' => 133 ],
    [ 'id' => 1332, 'label' => 'PM3', 'cost' => 22.20, 'cid' => 11, 'product_id' => 133 ],
    [ 'id' => 1341, 'label' => 'PM1', 'cost' => 98.25, 'cid' => 22, 'product_id' => 134 ],
    [ 'id' => 1342, 'label' => 'PM3', 'cost' => 22.20, 'cid' => 11, 'product_id' => 134 ]
];

$result = [];

array_walk($list, function ($item) use (&$result) {
  if (isset($result[$item['cid']])) {
    $result[$item['cid']]['cost'] = $item['cost'] + $result[$item['cid']]['cost'];
  } else {
    $result[$item['cid']] = [ 'label' => $item['label'], 'cost' => $item['cost'], 'cid' => $item['cid'] ];
  }
});

print_r($result);

输出:

代码语言:javascript
复制
Array
(
    [22] => Array
        (
            [label] => PM1
            [cost] => 196.5
            [cid] => 22
        )

    [11] => Array
        (
            [label] => PM3
            [cost] => 44.4
            [cid] => 11
        )

)
票数 0
EN

Stack Overflow用户

发布于 2022-02-17 14:56:44

我相信这应该能起作用

代码语言:javascript
复制
$CIDs_identified = array();
$final_array = array();

foreach($original_array as $small_array){
    if(!in_array($small_array['cid'], $CIDs_identified)){
        $CIDs_identified[] = $small_array['cid'];
        $final_array[$small_array['cid']] = array(
            'label' => $small_array['label'],
            'cost' => $small_array['cost'],
            'cid' => $small_array['cid'],
        );
    }else{
        $final_array[$small_array['cid']]['cost'] += $small_array['cost'];
    
    }
}
票数 1
EN

Stack Overflow用户

发布于 2022-02-17 15:06:07

在这个站点上,如果您可以以可用的格式提供源数组,这是非常有用的,这样我们就不必重新键入它了。其中一种方法是使用var_export__。

下面是一个简单的版本。创建一个由cid索引的数组。如果该项目不存在,则使用基本数据和零成本填充它。然后在每个循环中,包括初始部分,添加行的成本。

代码语言:javascript
复制
<?php
$data = [
    [
        'id' => 1331,
        'label' => 'PMI',
        'cost' => 98.25,
        'cid' => 22,
        'product_id' => 133,
    ],

    [
        'id' => 1341,
        'label' => 'PMI',
        'cost' => 98.25,
        'cid' => 22,
        'product_id' => 134,
    ],
];

$output = [];
foreach ($data as $item) {
    if (!isset($output[$item['cid']])) {
        $output[$item['cid']] = [
            'label' => $item['label'],
            'cost' => 0,
            'cid' => $item['cid'],
        ];
    }

    $output[$item['cid']]['cost'] += $item['cost'];
}

print_r($output);

这里的演示:https://3v4l.org/MY6Xu

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

https://stackoverflow.com/questions/71160243

复制
相关文章

相似问题

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