首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在php中根据键对数组求和

如何在php中根据键对数组求和
EN

Stack Overflow用户
提问于 2019-09-20 22:00:29
回答 2查看 54关注 0票数 3

我有一个这样的php数组

代码语言:javascript
复制
Array
(
    [0] => Array
        (
            [Sr_No] => 1
            [Asan_Category] => Warm-Up
            [Asan_Cat_Val] => 8
            [Asan_Sub_Category] => Ankle
            [Asan_Sub_Cat_Val] => 35
            [Asan_Name] => General Ankle Warm up
            [Asan_Name_Val] => 447
            [Prescribed_Steps] => 40
            [Prescribed_Ratio] => 00
            [Actual_Steps] => 12
            [Actual_Ratio] => 0
        )
 [1] => Array
        (
            [Sr_No] => 2
            [Asan_Category] => Warm-Up
            [Asan_Cat_Val] => 8
            [Asan_Sub_Category] => Knee
            [Asan_Sub_Cat_Val] => 111
            [Asan_Name] => General knee warm up
            [Asan_Name_Val] => 464
            [Prescribed_Steps] => 20
            [Prescribed_Ratio] => 00
            [Actual_Steps] => 14
            [Actual_Ratio] => 0
        )
[2] => Array
        (
            [Sr_No] => 1
            [Asan_Category] => Warm-Up
            [Asan_Cat_Val] => 8
            [Asan_Sub_Category] => Ankle
            [Asan_Sub_Cat_Val] => 35
            [Asan_Name] => General Ankle Warm up
            [Asan_Name_Val] => 447
            [Prescribed_Steps] => 40
            [Prescribed_Ratio] => 00
            [Actual_Steps] => 10
            [Actual_Ratio] => 0
        )
[3] => Array
        (
            [Sr_No] => 2
            [Asan_Category] => Warm-Up
            [Asan_Cat_Val] => 8
            [Asan_Sub_Category] => Knee
            [Asan_Sub_Cat_Val] => 111
            [Asan_Name] => General knee warm up
            [Asan_Name_Val] => 464
            [Prescribed_Steps] => 20
            [Prescribed_Ratio] => 00
            [Actual_Steps] => 9
            [Actual_Ratio] => 0
        )
)

The desired output I want 

Array
(
    [0] => Array
        (
            [Asan_Id] => 447
            [Asan_Category] => Warm-Up
            [Asan_Sub_Category] => Ankle
            [Asan_Name] => General Ankle Warm up
            [Prescribed_Steps] => 40
            [Prescribed_Ratio] => 00
            [Total_Steps] => 22
        )

    [1] => Array
        (
            [Asan_Id] => 464
            [Asan_Category] => Warm-Up
            [Asan_Sub_Category] => Knee
            [Asan_Name] => General knee warm up
            [Prescribed_Steps] => 20
            [Prescribed_Ratio] => 00
            [Total_Steps] => 23
        )
)

我希望那些重复的数据成为一个,但他们不同的实际步骤变成了他们的和的总步骤。请帮助我,因为我已经尝试了一些代码,但没有像这样成功

代码语言:javascript
复制
    $asan=[];
    $total_steps=0;
    foreach ($aasan_details as $key) {

        $total_steps += $key['Actual_Steps'];
        if(!in_array($key['Asan_Name_Val'],$asan))
        {
            $asan[] = $key['Asan_Name_Val'];

          $lookup[] = array("Asan_Id"=>$key['Asan_Name_Val'],
                      "Asan_Category"=>$key['Asan_Category'],
                      "Asan_Sub_Category"=>$key['Asan_Sub_Category'],
                      "Asan_Name"=>$key['Asan_Name'],
                      "Prescribed_Steps"=>$key['Prescribed_Steps'],
                      "Prescribed_Ratio"=>$key['Prescribed_Ratio'],
                      'Total_Steps'=>$total_steps);
        }


    }

它不工作,我该怎么办,伙计们,请帮帮我

其中$aasan_details是我在上面显示的数组,in lookup数组我得到了唯一的值,但没有得到它们的总和

EN

回答 2

Stack Overflow用户

发布于 2019-09-21 00:26:04

最好的解决方案是将其移动到数据库中,并使用查询为您执行确切的操作。

但是如果你必须在代码中做到这一点,你可以使用键控数组来对它们进行分组,无论它们需要多少个字段匹配才能连接起来:

例如:

代码语言:javascript
复制
foreach ..
$consolidated[$item['Asan_Cat_Val']][$item['Asan_Sub_Cat_Val']][] = $item;

然后做几个嵌套的循环来遍历它,并对所有内容进行汇总。

票数 2
EN

Stack Overflow用户

发布于 2020-03-07 19:34:58

这里有一些有用的技巧来解释……

  1. 您可以通过建立一个您知道要保留在(复制到)输出数组中的键的集合来减少循环数组声明中的眼睛疲劳。这使你不必像this那样输入每个组(但最终使你自己在构建输出数组时使用happy).
  2. Declare临时关联键(使用$id),以允许isset()对预先存在的组进行超快的检查。
  3. 如果组尚未设置,则将具有新键的数据与具有原始键的数据一起存储。不需要算术。我的代码片段中的+符号不是“加法运算符”,它们是“数组联合运算符”--它们在不调用函数的情况下合并三个数组(否则array_merge()也会这样做)。
  4. 迭代完数组后,您可以选择通过调用array_values()重新索引结果(删除临时关联键)。如果您不为这些临时密钥的存在而困扰,您可以省略函数调用。
  5. 如果您之前遇到过某个组,则只需修改Total_steps即可。使用加法赋值运算符(+=)可获得最简洁的语法。

代码:(Demo)

代码语言:javascript
复制
$keysToKeep = array_flip(['Asan_Category', 'Asan_Sub_Category', 'Asan_Name', 'Prescribed_Steps', 'Prescribed_Ratio']);

foreach ($array as $row) {
    $id = $row['Asan_Name_Val'];
    if (!isset($result[$id])) {
        $result[$id] = ['Asan_Id' => $id] + array_intersect_key($row, $keysToKeep) + ['Total_Steps' => $row['Actual_Steps']];
    } else {
        $result[$id]['Total_Steps'] += $row['Actual_Steps'];
    }
}
var_export(array_values($result));

输出:

代码语言:javascript
复制
array (
  0 => 
  array (
    'Asan_Id' => '447',
    'Asan_Category' => 'Warm-Up',
    'Asan_Sub_Category' => 'Ankle',
    'Asan_Name' => 'General Ankle Warm up',
    'Prescribed_Steps' => '40',
    'Prescribed_Ratio' => '00',
    'Total_Steps' => 22,
  ),
  1 => 
  array (
    'Asan_Id' => '464',
    'Asan_Category' => 'Warm-Up',
    'Asan_Sub_Category' => 'Knee',
    'Asan_Name' => 'General knee warm up',
    'Prescribed_Steps' => '20',
    'Prescribed_Ratio' => '00',
    'Total_Steps' => 23,
  ),
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58029861

复制
相关文章

相似问题

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