代码之家  ›  专栏  ›  技术社区  ›  JimB814

循环通过数组求一个元素的和

  •  1
  • JimB814  · 技术社区  · 7 年前

    $cart = [
    
        1031 => [
            'id'    => '1031',
            'model' => 'tr16',
            'price' => 100,
            'discount_applied' => '',
            'promo_name' => '',
            'promo_id' => ''
        ],
        1032 => [
            'id'    => '1032',
            'model' => 'tr16g',
            'price' => 100,
            'discount_applied' => '',
            'promo_name' => '',
            'promo_id' => ''
        ],
        1034 => [
            'id'    => '1034',
            'model' => 'tr17g',
            'price' => 100,
            'discount_applied' => '',
            'promo_name' => '',
            'promo_id' => ''
        ]
    ];
    

    我有一个ID数组,表示符合折扣条件的项目,如下所示:

    $itemIds = [
    
        0 => [
            0 => 1031
        ],
        1 => [
            0 => 1032
        ]
    ];
    

    我循环遍历每个数组并更改ID所在的价格 $cart 匹配中的ID $itemIds

    foreach($cart as &$item) {
        foreach($itemIds as $ids) {
            foreach($ids as $key => $value) { 
    
                if ($item['id'] == $value)   
                {             
                    $item['discount_applied'] = $item['price'] * 0.2;
                    $item['price'] = $item['price'] * .80;
                    $item['promo_name'] = 'Test promo';
                    $item['promo_id'] = 36;
                }     
            }
        }
    }
    

    在循环之前和之后将购物车打印到屏幕上显示它按预期工作。

    但是,我在尝试循环修改后的 $购物车 计算每个折扣的总和。

    $cart['total_discount'] = 0;
    foreach($cart as $item) 
    {
        $cart['total_discount'] += $item['discount_applied'];
    }
    echo 'Total discount:' . $cart['total_discount'];
    

    我希望看到折扣的总和=40,但实际上是=60。在循环前后将购物车打印到屏幕上显示1031和1032项的值为20 discount_applied

    任何帮助我确定哪里有一个或多个错误是感激的。

    如果你想复制/粘贴,这里有所有的代码。

    $cart = [
    
        1031 => [
            'id'    => '1031',
            'model' => 'tr16',
            'price' => 100,
            'discount_applied' => '',
            'promo_name' => '',
            'promo_id' => ''
        ],
        1032 => [
            'id'    => '1032',
            'model' => 'tr16g',
            'price' => 100,
            'discount_applied' => '',
            'promo_name' => '',
            'promo_id' => ''
        ],
        1034 => [
            'id'    => '1034',
            'model' => 'tr17g',
            'price' => 100,
            'discount_applied' => '',
            'promo_name' => '',
            'promo_id' => ''
        ]
    ];
    
    $itemIds = [
    
        0 => [
            0 => 1031
        ],
        1 => [
            0 => 1032
        ]
    ];  
    
    echo '<h2>Cart BEFORE discount</h2>'; echo '<pre>';print_r($cart); echo '</pre>';
    
    
    foreach($cart as &$item) {
        foreach($itemIds as $ids) {
            foreach($ids as $key => $value) { 
    
                if ($item['id'] == $value)   
                {             
                    $item['discount_applied'] = $item['price'] * 0.2);
                    $item['price'] = $item['price'] * .80;
                    $item['promo_name'] = 'Test promo';
                    $item['promo_id'] = 36;
                }     
            }
        }
    }
    
    echo '<h2>Cart AFTER discount</h2>'; echo '<pre>';print_r($cart); echo '</pre>';
    
    $cart['total_discount'] = 0;
    foreach($cart as $item) 
    {
        echo $item['discount_applied'] . '<br>';
        $cart['total_discount'] += $item['discount_applied'];
    }
    echo 'Total discount:' . $cart['total_discount'];
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Dave    7 年前

    你使用 &$item 在初始循环中也需要在最终循环中使用。将折扣总额相加的循环。您还需要查看折扣值是否为数字,因为在您发布的代码中,购物车中的第三个项目的折扣值为空,这将在尝试将其添加到折扣总额时引发非数字错误。

    $cart['total_discount'] = 0;
    foreach($cart as &$item) {
        echo '*' . $item['discount_applied'] . '*<br />';  // just to show what is or isn't there
        $cart['total_discount'] += (is_numeric($item['discount_applied']) ? $item['discount_applied'] : 0);
    }
    echo 'Total discount:' . $cart['total_discount'];