PHP:比较数组,获取最大价值并更新

巴德沃克斯

我有一个从菜单提交的数组,我必须采用子类别中的最大值,并且仅使用最高价格。随着用户添加更多项目,更新可能会发生多次。

User Scenario:用户单击一种成分,然后单击另一种,然后单击另一种。在每次添加期间,价格都会动态更新。

子类别之一是salad greensingredienttype_id = 1

当前代码:

  $prices = $db->get_ingredient_prices($list);
  $free_items = $db->get_free_ingredient_types($item);

    foreach($prices as $price){
      if(array_key_exists($price['ingredienttype_id'], $free_items)){
        $qtyA = $free_items[$price['ingredienttype_id']];
        $qtyB = $customizations[$price['id']];

        if($qtyA == 0){
          $qtyC = $qtyB;
        } elseif($qtyA > $qtyB){
          $free_items[$price['ingredienttype_id']] = $qtyA - $qtyB;
          $qtyC = 0;
        } elseif($qtyA < $qtyB){
          $free_items[$price['ingredienttype_id']] = 0;
          $qtyC = $qtyB - $qtyA;
        } else {
          $free_items[$price['ingredienttype_id']] = 0;
          $qtyC = 0;
        }

      } else {
        $qtyC = $customizations[$price['id']];
      }

      if ($qty > -1) {
        $customizations_total = $customizations_total + ($price['price'] * $qtyC);
      } else {
        $customizations_total = $customizations_total + $price['price'];
      }
    }

    return number_format($customizations_total,2);

现在,我必须以某种方式在此示例代码中创建我的循环。

这是尝试获取正确类别时来自foreach循环的示例输出:

$list = [4, 6, 8, 114, 98];
$prices = $db->get_ingredient_prices($list);

  foreach ($prices as $k => $v) {
    if ($v['ingredienttype_id'] == '1') { $greens[] = $v; }
  }

样本输出:

array (size=6) [prices]
  0 => 
    array (size=8)
      'id' => string '6' (length=1)
      'name' => string 'Spinach' (length=7)
      'description' => string '' (length=0)
      'price' => string '0.69' (length=1)
      'ingredienttype_id' => string '1' (length=1)
      'active' => string '1' (length=1)
      'nutritionix_id' => string '529e7dd1f9655f6d35001d40' (length=24)
      'nutritionix_cal' => string '55' (length=2)
  1 => 
    array (size=8)
      'id' => string '8' (length=1)
      'name' => string 'Kale' (length=4)
      'description' => string 'Local' (length=5)
      'price' => string '0' (length=1)
      'ingredienttype_id' => string '1' (length=1)
      'active' => string '1' (length=1)
      'nutritionix_id' => string '529e7dd1ea63d49335001d48' (length=24)
      'nutritionix_cal' => string '71' (length=2)
  2 => 
    array (size=8)
      'id' => string '4' (length=1)
      'name' => string 'Bleu Cheese' (length=11)
      'description' => string '' (length=0)
      'price' => string '0.69' (length=4)
      'ingredienttype_id' => string '7' (length=1)
      'active' => string '1' (length=1)
      'nutritionix_id' => string '529e7dd1ea63d49335001d42' (length=24)
      'nutritionix_cal' => string '160' (length=3)
  3 => 
    array (size=8)
      'id' => string '98' (length=2)
      'name' => string 'Asian Sesame' (length=12)
      'description' => string '' (length=0)
      'price' => string '0.69' (length=4)
      'ingredienttype_id' => string '7' (length=1)
      'active' => string '1' (length=1)
      'nutritionix_id' => string '529e7dd1f9655f6d35001d3d' (length=24)
      'nutritionix_cal' => string '125' (length=3)
  4 => 
    array (size=8)
      'id' => string '114' (length=3)
      'name' => string 'Arugula ' (length=8)
      'description' => string 'Local' (length=5)
      'price' => string '0.99' (length=4)
      'ingredienttype_id' => string '1' (length=1)
      'active' => string '1' (length=1)
      'nutritionix_id' => string '529e7dd1f9655f6d35001d24' (length=24)
      'nutritionix_cal' => string '35' (length=2)

array (size=3) [greens]
  0 => 
    array (size=8)
      'id' => string '6' (length=1)
      'name' => string 'Spinach' (length=7)
      'description' => string '' (length=0)
      'price' => string '0.69' (length=1)
      'ingredienttype_id' => string '1' (length=1)
      'active' => string '1' (length=1)
      'nutritionix_id' => string '529e7dd1f9655f6d35001d40' (length=24)
      'nutritionix_cal' => string '55' (length=2)
  1 => 
    array (size=8)
      'id' => string '8' (length=1)
      'name' => string 'Kale' (length=4)
      'description' => string 'Local' (length=5)
      'price' => string '0' (length=1)
      'ingredienttype_id' => string '1' (length=1)
      'active' => string '1' (length=1)
      'nutritionix_id' => string '529e7dd1ea63d49335001d48' (length=24)
      'nutritionix_cal' => string '71' (length=2)
  2 => 
    array (size=8)
      'id' => string '114' (length=3)
      'name' => string 'Arugula ' (length=8)
      'description' => string 'Local' (length=5)
      'price' => string '0.99' (length=4)
      'ingredienttype_id' => string '1' (length=1)
      'active' => string '1' (length=1)
      'nutritionix_id' => string '529e7dd1f9655f6d35001d24' (length=24)
      'nutritionix_cal' => string '35' (length=2)

从果岭上,我只需要记录芝麻菜的价格,因为它是最高的。必须为每个新添加的,甚至可能要除去的芝麻菜都执行此检查。

我想在将$prices数组添加到后将要使用多个foreach循环

  1. 获取$greens数组
  2. 从价格中获取最大值并记录商品ID
  3. 重新迭代原始$prices数组,并将匹配的配料价格设置ingredienttype_id == 1为0,同时保留max的输出。

因此,我有点想通过3个foreach循环来获得所需的结果。有更好的方法还是这是唯一的方法?

模糊树

我建议您在数据库上跟踪用户选择的成分,这将使您轻松查询总价格。

用户添加/删除成分时,您可以更新包含以下列的联接表:

selected_ingredients
(user_id, ingredient_id)

然后,您可以计算每种成分类型的最高价格:

select max(price), ingredienttype_id
from ingredients i
join selected_ingredients si on si.ingredient_id = i.id
where si.user_id = ?
group by i.ingredienttype_id

或总为

select sum(price) from (
    select max(price) price, ingredienttype_id
    from ingredients i
    join selected_ingredients si on si.ingredient_id = i.id
    where si.user_id = ?
    group by i.ingredienttype_id
) t1

如果您已经在会话中跟踪选定的产品,则无需将选择记录在联接表中,而可以使用以下查询:

select sum(price) from (
    select max(price) price, ingredienttype_id
    from ingredients     
    where id in (?)
    group by ingredienttype_id
) t1

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章