PHP 按两个键对数组进行分组并得到总数

PHP group array by two keys and get total

我有来自 $_POST 的长数组(可能有数百个),需要汇总数量。

下面是 $_POST 结果:

array(5) {
  ["Batch_No"]=>
  array(3) {
    [0]=>
    string(7) "AAAV343"
    [1]=>
    string(7) "AAAV343"
    [2]=>
    string(7) "AAAV347"
  }
  ["Expire"]=>
  array(3) {
    [0]=>
    string(0) ""
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
  }
  ["Prod_ID"]=>
  array(3) {
    [0]=>
    string(5) "00041"
    [1]=>
    string(5) "00041"
    [2]=>
    string(5) "00041"
  }
  ["zID_Line"]=>
  array(3) {
    [0]=>
    string(2) "17"
    [1]=>
    string(2) "17"
    [2]=>
    string(2) "17"
  }
  ["Qty"]=>
  array(3) {
    [0]=>
    string(1) "1"
    [1]=>
    string(1) "1"
    [2]=>
    string(1) "1"
  }
}

我需要使用 Batch_NoProd_ID 来汇总数组,这样结果就是变成这样:

array(5) {
  ["Batch_No"]=>
  array(2) {
    [0]=>
    string(7) "AAAV343"
    [1]=>
    string(7) "AAAV347"
  }
  ["Expire"]=>
  array(2) {
    [0]=>
    string(0) ""
    [1]=>
    string(0) ""
  }
  ["Prod_ID"]=>
  array(2) {
    [0]=>
    string(5) "00041"
    [1]=>
    string(5) "00041"
  }
  ["zID_Line"]=>
  array(2) {
    [0]=>
    string(2) "17"
    [1]=>
    string(2) "17"
  }
  ["Qty"]=>
  array(2) {
    [0]=>
    string(1) "2"
    [1]=>
    string(1) "1"
  }
}

Qty 基本上是每个数组的总和,它们具有相同的 Batch_NoProd_ID.

一直在尝试探索现有主题,但由于这两个键而无法解决问题。

我不太清楚你所说的 "summarize the array using Batch_No and Prod_ID" 是什么意思:我在 Prod_ID 中看不到 'uniqueness'。 Hoewever,以下代码将创建一个数组($totals),其中只有唯一的 'Batch_No',对于那些,ExpireProd_ID 和 [的所有(第一个)匹配值=15=],以及 Qty 的总和。

$totals = array(
    'Batch_No' => array(),
    'Expire' => array(),
    'Prod_ID' => array(),
    'zID_Line' => array(),
    'Qty' => array(),
);
foreach($_POST['Batch_No'] as $key => $value) {
    if ($key2 = array_search($value, $totals['Batch_No'])) {
        $totals['Qty'][$key2] += $_POST['Qty'][$key];
    } else {
        $totals['Batch_No'][] = $_POST['Batch_No'][$key];
        $totals['Expire'][]   = $_POST['Expire'][$key];
        $totals['Prod_ID'][]  = $_POST['Prod_ID'][$key];
        $totals['zID_Line'][] = $_POST['zID_Line'][$key];
        $totals['Qty'][]      = $_POST['Qty'][$key];
    }
}

它通过迭代 POST 值来工作。对于在 Batch_No 中找到的每个值,它会尝试在 $totals 中找到它。如果不存在,请添加它。如果已经存在,请保留大部分值,但将 Qty 中找到的数量添加到已存储的数量中。