如何分组子阵列并执行条件计算?

时间:2018-05-06 08:01:19

标签: php multidimensional-array conditional grouping integer-arithmetic

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

如果moving_type1,则product_number应增加当前product_id的整体product_number标记。或者,如果moving_type2,那么整体product_number总计应减少product_number值。

这是我的输入数组:

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
        )
)

我想要的结果是:

Array
(
    [0] => Array
        (
            [id] => 1
            [product_id] => 4
            [product_number] => 10
        )

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

2 个答案:

答案 0 :(得分:0)

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

$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);

输出:

Array
(
    [0] => Array
        (
            [id] => 1
            [product_id] => 4
            [product_number] => 10
        )

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

)

答案 1 :(得分:0)

最有效地使用基于<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> <script src="https://aframe.io/releases/0.8.2/aframe.min.js"></script> <script src="https://cdn.rawgit.com/jeromeetienne/AR.js/1.5.5/aframe/build/aframe-ar.js"></script> <body style='margin : 0px; overflow: hidden;'> <a-scene embedded arjs='trackingMethod: best; debugUIEnabled: false;'> <!--a-marker type='pattern' url='https://rawgit.com/germanviscuso/AR.js/master/data/data/patt.gafas'--> <a-marker preset='hiro'> <a-collada-model src="url(https://aframe.io/aframe/examples/showcase/shopping/man/man.dae)"></a-collada-model> </a-marker> <a-camera-static/> </a-scene> </body> 的临时密钥来确定您是在两个值之间执行算术还是仅仅声明product_id的第一个出现值。

如果是第一次出现,只需将行的前三行切片并保留键(即product_id部分)。

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

循环结束后,您可以使用1重新索引生成的数组。

代码:(Demo

-1

输出:

array_values()