首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对子数组进行分组并执行条件计算?

如何对子数组进行分组并执行条件计算?
EN

Stack Overflow用户
提问于 2018-05-06 08:01:19
回答 2查看 51关注 0票数 1

我需要使用product_id对我的子数组进行分组,并执行一些条件运算。

如果moving_type1,那么当前product_id的总体product_number计数应该由product_number来增加。或者,如果moving_type2,那么总的product_number统计值应该减少product_number值。

这是我的输入数组:

代码语言:javascript
复制
Array
(
    [0] => Array
        (
            [id] => 1
            [product_id] => 4
            [product_number] => 10
            [moving_type] => 1
        )

    [1] => Array
        (
            [id] => 1
            [product_id] => 5
            [product_number] => 10
            [moving_type] => 1 // product addition
        )

    [2] => Array
        (
           [id] => 1
            [product_id] => 5
            [product_number] => 2
            [moving_type] => 2 // product minus
        )
)

我想要的结果是:

代码语言:javascript
复制
Array
(
    [0] => Array
        (
            [id] => 1
            [product_id] => 4
            [product_number] => 10
        )

    [1] => Array
        (
            [id] => 1
            [product_id] => 5
            [product_number] => 8 // as 10-2
         )
)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-06 08:41:40

最有效地使用基于product_id的临时键来确定您是在两个值之间执行算术,还是仅仅声明product_id的第一个出现的值。

如果这是第一次出现,只需将前三行从行中切片,并保留键(这是true部分)。

如果这不是product_id的第一次出现,那么您只需要更新product_number元素。根据moving_type值确定正确的操作--使用该值,将product_number乘以1-1,并将生成的值添加到存储的值中。

循环完成后,可以使用array_values()重新索引结果数组。

代码:(演示)

代码语言:javascript
复制
$array = [
     ['id' => 1, 'product_id' => 4, 'product_number' => 10, 'moving_type' => 1],
     ['id' => 1, 'product_id' => 5, 'product_number' => 10, 'moving_type' => 1],
     ['id' => 1, 'product_id' => 5, 'product_number' => 2, 'moving_type' => 2]
];

foreach ($array as $row) {
    if (!isset($result[$row['product_id']])) {
        $result[$row['product_id']] = array_slice($row, 0, 3, true);
    } else {
        $result[$row['product_id']]['product_number'] += ($row['moving_type'] == 1 ? 1 : -1) * $row['product_number'];
    }
}

var_export(array_values($result));

输出:

代码语言:javascript
复制
array (
  0 => 
  array (
    'id' => 1,
    'product_id' => 4,
    'product_number' => 10,
  ),
  1 => 
  array (
    'id' => 1,
    'product_id' => 5,
    'product_number' => 8,
  ),
)
票数 0
EN

Stack Overflow用户

发布于 2018-05-06 08:14:08

您可以使用foreach()循环。在其中,您可以使用product_id作为键创建一个新数组。您可以使用*=-1更改product_number的符号,如果键已经存在,则将当前的product_number添加到现有的product_number中。

代码语言:javascript
复制
$array = array(
     array('id' => 1, 'product_id' => 4, 'product_number' => 10, 'moving_type' => 1),
     array('id' => 1, 'product_id' => 5, 'product_number' => 10, 'moving_type' => 1),
     array('id' => 1, 'product_id' => 5, 'product_number' => 2, 'moving_type' => 2)
);

$final = [];
foreach ($array as $item) {
    $pid = $item['product_id'] ;
    if ($item['moving_type'] == 2) $item['product_number'] *= -1;
    unset($item['moving_type']);

    if (!isset($final[$pid])) { $final[$pid] = $item ; }
    else {
        $final[$pid]['product_number'] += $item['product_number'] ;
    }
}
$final = array_values($final);
print_r($final);

输出:

代码语言:javascript
复制
Array
(
    [0] => Array
        (
            [id] => 1
            [product_id] => 4
            [product_number] => 10
        )

    [1] => Array
        (
            [id] => 1
            [product_id] => 5
            [product_number] => 8
        )

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

https://stackoverflow.com/questions/50197496

复制
相关文章

相似问题

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