Php 如何对具有按类别排序的相同键的数组的值求和?

Php 如何对具有按类别排序的相同键的数组的值求和?,php,arrays,sum,key,Php,Arrays,Sum,Key,类别: array:3 [▼ "78f895684c" => "blue" "f71db561ba" => "green" "3e231651de" => "blue" ] numbersGroup: array:3 [▼ 0 => array:4 [▼ "uuid" => "78f895684c" "price" => "10" "discount" => "0" "total" => "10.0

类别

array:3 [▼
  "78f895684c" => "blue"
  "f71db561ba" => "green"
  "3e231651de" => "blue"
]
numbersGroup:

array:3 [▼
  0 => array:4 [▼
    "uuid" => "78f895684c"
    "price" => "10"
    "discount" => "0"
    "total" => "10.00"
  ]
  1 => array:4 [▼
    "uuid" => "f71db561ba"
    "price" => "2"
    "discount" => "0"
    "total" => "2.00"
  ]
  2 => array:4 [▼
    "uuid" => "3e231651de"
    "price" => "50"
    "discount" => "10"
    "total" => "40.00"
  ]
]
我尝试创建一个数组,将我的项目分类,同时也将一个类别中的所有项目相加。这就是我所拥有的:

  foreach ($numbersGroup as $group) {
      $cat = $category[$group['uuid']];
      unset($group['uuid']);
      $numbersArray[$cat][] = $group;
    }
结果是:

array:2 [▼
  "blue" => array:2 [▼
    0 => array:3 [▼
      "price" => "10"
      "discount" => "0"
      "total" => "10.00"
    ]
    1 => array:3 [▼
      "price" => "50"
      "discount" => "10"
      "total" => "40.00"
    ]
  ]
  "green" => array:1 [▼
    0 => array:3 [▼
      "price" => "2"
      "discount" => "0"
      "total" => "2.00"
    ]
  ]
]
这就是我努力实现的目标:

 array:2 [▼
      "blue" => array:2 [▼
        0 => array:3 [▼
          "price" => "60"
          "discount" => "10"
          "total" => "50.00"
        ]
      ]
      "green" => array:1 [▼
        0 => array:3 [▼
          "price" => "2"
          "discount" => "0"
          "total" => "2.00"
        ]
      ]
    ]
这是我的方法:

foreach ($numbersGroup as $group) {
  $cat = $category[$group['uuid']];
  unset($group['uuid']);
  foreach ($group as $key => $value) {
    $sum += $value;
  }
  $numbersArray[$cat][] = $sum;
}
但我得到了一个错误:

不支持的操作数类型


你能试试下面的代码吗

foreach ($numbersGroup as $group) {
  $cat = $category[$group['uuid']];
  if(!isset( $numbersArray[$cat][0]) )
    $numbersArray[$cat][] = $group;
  else{
     // If index is known, you can use below code
    /*$numbersArray[$cat][0]["price"]+=  $group['price'];
    $numbersArray[$cat][0]["discount"]+=  $group['discount'];
    $numbersArray[$cat][0]["total"]+=  $group['total'];*/


    // If index is not known
    foreach($group as $key => $value){
        if (is_numeric($value)) {
            $numbersArray[$cat][0][$key]+=  $group[$key];
        }
    }


  }     
}
现在我添加了数组索引未知的情况。我们需要在添加值之前进行数字检查。
我希望这能帮助你:)

你能试试下面的代码吗

foreach ($numbersGroup as $group) {
  $cat = $category[$group['uuid']];
  if(!isset( $numbersArray[$cat][0]) )
    $numbersArray[$cat][] = $group;
  else{
     // If index is known, you can use below code
    /*$numbersArray[$cat][0]["price"]+=  $group['price'];
    $numbersArray[$cat][0]["discount"]+=  $group['discount'];
    $numbersArray[$cat][0]["total"]+=  $group['total'];*/


    // If index is not known
    foreach($group as $key => $value){
        if (is_numeric($value)) {
            $numbersArray[$cat][0][$key]+=  $group[$key];
        }
    }


  }     
}
现在我添加了数组索引未知的情况。我们需要在添加值之前进行数字检查。
我希望这对您有所帮助:)

检查
$numbersArray[$cat]
是否已设置-如果已设置,请不要添加新的数组元素,而是将单个值添加到现有数组键中

foreach ($numbersGroup as $group) {
  $cat = $category[$group['uuid']];
  unset($group['uuid']);
  if(isset($numbersArray[$cat])) {
    $numbersArray[$cat]['price'] += $group['price'];
    $numbersArray[$cat]['discount'] += $group['discount'];
    $numbersArray[$cat]['total'] += $group['total'];
  }
  else {
    $numbersArray[$cat] = $group; // no [] here, because we want only a single element
  }
}
或者,在没有明确if的情况下,使用
??
运算符:

foreach ($numbersGroup as $group) {
      $cat = $category[$group['uuid']];
      $numbersArray[$cat]['price'] = ($numbersArray[$cat]['price'] ?? 0) + $group['price'];
      $numbersArray[$cat]['discount'] = ($numbersArray[$cat]['discount'] ?? 0) + $group['discount'];
      $numbersArray[$cat]['total'] = ($numbersArray[$cat]['total'] ?? 0) + $group['total'];
}
-- 编辑:


不幸的是,我无法在代码中写入“价格”、“折扣”等,因为这些值总是不同的,不能硬编码

然后循环使用您从组中获得的密钥,因为您已经尝试使用初始代码:

foreach ($numbersGroup as $group) {
  $cat = $category[$group['uuid']];
  unset($group['uuid']);
  foreach($group as $key => $value) {
    $numbersArray[$cat][$key] = ($numbersArray[$cat][$key] ?? 0) + $value;
  }
}

检查
$numbersArray[$cat]
是否已设置-如果已设置,则不要添加新数组元素,而是将单个值添加到现有数组键

foreach ($numbersGroup as $group) {
  $cat = $category[$group['uuid']];
  unset($group['uuid']);
  if(isset($numbersArray[$cat])) {
    $numbersArray[$cat]['price'] += $group['price'];
    $numbersArray[$cat]['discount'] += $group['discount'];
    $numbersArray[$cat]['total'] += $group['total'];
  }
  else {
    $numbersArray[$cat] = $group; // no [] here, because we want only a single element
  }
}
或者,在没有明确if的情况下,使用
??
运算符:

foreach ($numbersGroup as $group) {
      $cat = $category[$group['uuid']];
      $numbersArray[$cat]['price'] = ($numbersArray[$cat]['price'] ?? 0) + $group['price'];
      $numbersArray[$cat]['discount'] = ($numbersArray[$cat]['discount'] ?? 0) + $group['discount'];
      $numbersArray[$cat]['total'] = ($numbersArray[$cat]['total'] ?? 0) + $group['total'];
}
-- 编辑:


不幸的是,我无法在代码中写入“价格”、“折扣”等,因为这些值总是不同的,不能硬编码

然后循环使用您从组中获得的密钥,因为您已经尝试使用初始代码:

foreach ($numbersGroup as $group) {
  $cat = $category[$group['uuid']];
  unset($group['uuid']);
  foreach($group as $key => $value) {
    $numbersArray[$cat][$key] = ($numbersArray[$cat][$key] ?? 0) + $value;
  }
}

检查
$numbersArray[$cat]
是否已设置-如果已设置,则不要添加新的数组元素,而是将单个值添加到现有数组键。@04FS当我
转储($numbersArray[$cat])
然后我得到错误
未定义变量:numbersArray
dump
是一个调试函数-检查变量或数组键是否已设置是
isset
的工作。检查
$numbersArray[$cat]
是否已设置-如果已设置,请不要添加新的数组元素,但将单个值添加到现有数组键中。@04FS当I
dump($numbersArray[$cat])
然后我得到错误
未定义变量:numbersArray
dump
是一个调试函数-检查变量或数组键是否已设置,这是
isset
的工作。不幸的是,我无法在代码中写入“价格”、“折扣”等,因为这些值总是不同的,这是不可能的hardcoded@peace_love参见编辑,然后循环你在组中得到的密钥,就像你已经尝试过的那样。你在两个地方都相应地修改了它吗<代码>$numbersArray[$cat]['sum'][$key]=($numbersArray[$cat]['sum'][$key]?0)+$value(但在我的问题中,您看到,它从一开始就被要求提供子键解决方案)是的,有点-您有数字键。我的意思是更多地结合键必须是动态的…没关系,只要问题得到解决:-)很遗憾,我不能在我的代码中写入“价格”、“折扣”等,因为这些值总是不同的,这是不可能的hardcoded@peace_love请参见编辑,在组中获得的关键点上循环,正如您在初始尝试中所做的那样。您是否在两个位置都相应地修改了它<代码>$numbersArray[$cat]['sum'][$key]=($numbersArray[$cat]['sum'][$key]?0)+$value(但在我的问题中,您看到,它从一开始就被要求提供子键解决方案)是的,有点-您有数字键。我的意思是更多地结合键必须是动态的…没关系,只要问题解决:-)我不幸需要一个非硬编码的解决方案,因为它不是alwas价格,有时还有其他值,或者更多值。我不幸需要一个非硬编码的解决方案,因为它不是alwas价格,有时还有其他值,或更多值