对多次表单提交累积的柱状值进行求和

问题描述 投票:0回答:3

提交表单后,我收到一个索引数组作为 SQL 查询结果,目标是将特定于列的值与之前收集的结果相加。

示例:

// 1st query result
$product_amount = [0.36, 0.14, 0.42]

// 2nd query result
$product_amount = [0.28, 0.12, 0.40]

// n-th query result
$product_amount = [0.16, 0.14, 0.42]

// the desired sum
$total = [0.80, 0.40, 1.24]

如何做?

创建数组的代码:

function doseCount($num){
    return ($num/100) * intval($_POST['portion']); //getting multiplier for productAmount() function
}

function productAmount(){
    global $link; //connection to the MySQL server
    if(isset($_POST['product'])){
        $product_amount_query = 'SELECT va.vitamin_a, va.vitamin_b1, va.vitamin_b2, va.vitamin_b3, va.vitamin_b5, 
                va.vitamin_b6, va.vitamin_bc_b9, va.vitamin_b12, va.vitamin_c, va.vitamin_d, va.vitamin_e, va.biotin, va.vitamin_k, 
                va.flavonoids, va.lipoic_acid FROM products_list p, vitamins_amount va WHERE p.id = va.product_id AND p.name = ?';
            
        $product_amount_stmt = mysqli_prepare($link, $product_amount_query);
        mysqli_stmt_bind_param($product_amount_stmt, "s", $_POST['product']);
        mysqli_stmt_execute($product_amount_stmt);
    
        $result = mysqli_stmt_get_result($product_amount_stmt);

        $product = mysqli_fetch_array($result, MYSQLI_NUM);
    
        return $product_final_result = array_map('doseCount', $product);
        mysqli_stmt_close($product_amount_stmt);
        mysqli_close($link);
   }
}

$product_amount = productAmount();

提交后,

$product_amount
数组获得新数据,并且此新数据必须添加到之前积累的数据中。

php arrays session sum persistent-storage
3个回答
0
投票

您可以通过组合 array_maparray_sum 来实现此目的。如果您使用 PHP 5.6 或更高版本(您应该使用 PHP 5.6 或更高版本),您可以编写如下内容:

$total = array_map(function (...$vals) {
    return array_sum($vals);
}, ...$results);

假设

$results
包含所有
$product_amount
数组。

如果您想增量构建

$total
而不是一次传递所有查询结果,您可以这样做:

// Initialize $total array
$total = [0, 0, 0];

// Update $total for each query
$total = array_map(function (...$vals) {
    return array_sum($vals);
}, $total, $product_amount);

0
投票

这个问题可以通过正确使用会话来解决:

if (empty($_SESSION['product_amount'])){
    $_SESSION['product_amount'] = $product_amount;
}else{
    foreach ($_SESSION['product_amount'] as $key => $value) {
        $_SESSION['product_amount'][$key] += $product_amount[$key];
    }
}

特别感谢 Mawia HL 的帮助。


0
投票

我有一些疑虑和建议:

  • 请勿使用
    global
    来获取所需值。明确地将所需数据传递给您的函数。
  • 函数/方法不应直接访问
    $_POST
    ——这些值应显式传入,以便您的代码可以更轻松地进行单元测试。
  • 由于
    $portion
    的计算很小且无条件,我可能会直接将该步骤构建到
    productAmount()
    中。
  • 收集行后,您可以对每列数据进行
    array_sum()
    的映射调用,如果您愿意,甚至可以将浮点值截断为一定的小数位数。
  • 理想情况下,在一次数据库访问中获取所有行是有意义的。我想说你的任务可以完全用 SQL 来完成,但我不会完全重构你的代码。

代码:(PHPize演示

function productAmount($mysqli, $productName, $portion): array
{
    $sql = '
        SELECT va.vitamin_a,
               va.vitamin_b1,
               va.vitamin_b2,
               va.vitamin_b3,
               va.vitamin_b5,
               va.vitamin_b6,
               va.vitamin_bc_b9,
               va.vitamin_b12,
               va.vitamin_c,
               va.vitamin_d,
               va.vitamin_e,
               va.biotin,
               va.vitamin_k,
               va.flavonoids,
               va.lipoic_acid
        FROM products_list   p
        JOIN vitamins_amount va ON p.id = va.product_id
        WHERE p.name = ?
    ';
    $stmt = $mysqli->prepare($sql);
    $stmt->execute([$productName]);
    return array_map(
        fn(int $amount) => ($amount / 100) * $portion,
        $stmt->get_result()->fetch_array(MYSQLI_NUM)
    );
}

$POSTs = [
    ['product' => 'goodinya', 'portion' => 3],
    ['product' => 'healthy1', 'portion' => 2],
    ['product' => 'vitastic', 'portion' => 4],
];

$result = [];
foreach ($POSTs as ['product' => $product, 'portion' => $portion]) {
    $result[] = productAmount($mysqli, $product, $portion);
}

var_export(
    array_map(
        fn(...$rows) => sprintf('%0.2f', array_sum($rows)),
        ...$result
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.