PHP 如何对同一键的数组的值求和


PHP How to sum values of the array of the same key

这个问题可能看起来是重复的,但我发誓已经尝试了数千种解决方案,现在已经好几个小时了......

我有一个这样的关联多维数组:

    1 => 
    array (size=1)
      'Pld' => 
        array (size=2)
          'score_good_answers' => string '1' (length=1)
          'score_bad_answers' => string '0' (length=1)
  2 => 
    array (size=1)
      'Aln' => 
        array (size=2)
          'score_good_answers' => string '0' (length=1)
          'score_bad_answers' => string '1' (length=1)
  3=> 
    array (size=1)
      'IPS' => 
        array (size=2)
          'score_good_answers' => string '1' (length=1)
          'score_bad_answers' => string '0' (length=1)
 4 => 
    array (size=1)
      'Pld' => 
        array (size=2)
          'score_good_answers' => string '1' (length=1)
          'score_bad_answers' => string '0' (length=1)
  5 => 
    array (size=1)
      'Aln' => 
        array (size=2)
          'score_good_answers' => string '1' (length=1)
          'score_bad_answers' => string '0' (length=1)
 6 => 
        array (size=1)
          'Aln' => 
            array (size=2)
              'score_good_answers' => string '1' (length=1)
              'score_bad_answers' => string '0' (length=1)

对于Var_Export

1=> array ( 'Pld' => array ( 'score_good_answers' => '1', 'score_bad_answers' => '0', ), ), 2 => array ( 'Aln' => array ( 'score_good_answers' => '0', 'score_bad_answers' => '1', ), ), 3 => array ( 'IPS' => array ( 'score_good_answers' => '1', 'score_bad_answers' => '0', ), ), 4 => array ( 'Pld' => array ( 'score_good_answers' => '1', 'score_bad_answers' => '0', ), ),  5 => array ( 'Aln' => array ( 'score_good_answers' => '1', 'score_bad_answers' => '0', ), ),  6 => array ( 'Aln' => array ( 'score_good_answers' => '1', 'score_bad_answers' => '0', ), ),

我需要对所有Aln的所有'score_good_answers''score_bad_answers'求和Pld等等。

最糟糕的情况是,这个键,即:是可变值。

在这个级别上,任何有效的解决方案都将受到赞赏。

我尝试了这个SO问题中的接受答案:如何对同一键的数组的值求和?

但是,它似乎抛出了几个错误....

我从几个SO问题中尝试了更多解决方案,即:如何对同一键的数组的值求和?,基于同一键的值数组总和,如何通过同一键对值求和并按其他键分组等等......

另一个接近的问题是:如何在php中对相同的数组求和

并尝试了:

$array2 = array();
    for($f = 0; $f<count($getCategories); $f++){
        foreach($getCategories[$i] as $k=>$v) {
    if(!isset($array2[$v['Aln']])) {
        $array2[$v['Aln']] = $v;
    } else {
        $array2[$v['Aln']]['score_good_answers'] += $v['score_good_answers'];
    }
}
        }   var_dump($array2);

我仍然得到几个Errors,包括invalid arguments undefined offsets等等

谦虚地请求任何建议。

谢谢

您可以使用以下代码:

$answers = array();
foreach ($getCategories as $categories){
    foreach($categories as $category => $scores){
        foreach ($scores as $type => $score){
            if (isset($answers[$category][$type])){
                $answers[$category][$type] += (int) $score;
            } else {
                $answers[$category][$type] = (int) $score;
            }
        }
    }
}

的输出将是以下数组:

Array
(
    [Pld] => Array
        (
            [score_good_answers] => 2
            [score_bad_answers] => 0
        )
    [Aln] => Array
        (
            [score_good_answers] => 2
            [score_bad_answers] => 1
        )
    [IPS] => Array
        (
            [score_good_answers] => 1
            [score_bad_answers] => 0
        )
)

保存键的变量名为 $f,但您尝试在下一行使用未定义的变量$i,请参阅?这是你的警告之一,不会做你想要的。在第二行使用$f。

for($f = 0; $f<count($getCategories); $f++){
    foreach($getCategories[$i] as $k=>$v) {

您的数据结构似乎有点奇怪?在最顶层的第二个数组中总是只有一个键吗?

如果可能的话,这会更漂亮:

array(2) {
  [0] => stdClass#1 (3) {
    public $name => string(4) "Pld"
    public $score_good_answers => int(1)
    public $score_bad_answers=> int(0)
  }
  [1] => stdClass#1 (3) {
    public $name => string(4) "Aln"
    public $score_good_answers => int(0)
    public $score_bad_answers=> int(1)
  }
}

我看不出你想要的最终结果是什么,但试一试,可能不适合你想要的。

$goodAnswersByCategoryDataKey = array();
$badAnswersByCategoryDataKey = array();
foreach ($categories as $i => $category) {
    foreach ($category as $categoryDataKey => $categoryData) {
        if (!isset($goodAnswersByCategoryDataKey[$categoryDataKey])) {
            $goodAnswersByCategoryDataKey[$categoryDataKey] = 0;
        }
        $goodAnswersByCategoryDataKey[categoryDataKey] += $categoryData['score_good_answers'];
        if (!isset($badAnswersByCategoryDataKey[$categoryDataKey])) {
            $badAnswersByCategoryDataKey[$categoryDataKey] = 0;
        }
        $badAnswersByCategoryDataKey[$categoryDataKey] += $categoryData['score_bad_answers'];
    }
}
var_dump(goodAnswersByCategoryDataKey);
var_dump(badAnswersByCategoryDataKey);

如果它是一个迭代结构,如您的示例所示,您可以这样做:

$answers = [];
$nbCat = count($getCategories);
for($i = 0; $i < $nbCat; $i++) {
    foreach($getCategories[$i] as $key => $scores) {
        if(empty($answers[$key])) {
             $answers[$key] = $scores;
        }
        else {
            $answers[$key]['score_good_answers'] += $scores['score_good_answers'];
            $answers[$key]['score_bad_answers'] += $scores['score_bad_answers'];
        }
    }
}