2014-11-26 3 views
0

Этот вопрос может показаться дубликат, но я клянусь, что пытался и пытался тысячи решений в течение многих часов теперь ...PHP Как суммировать значения массива того же ключа

I есть ассоциативный многомерный массив так:

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',),), 

Мне нужно ПОЛУЧИТЬ все 'score_good_answers' и 'score_bad_answers' для всех Aln s и Pld и так далее.

Худший сценарий случая заключается в том, что эти клавиши i.e: являются изменяемыми значениями.

На этом уровне, любое решение, которое работает, будет хорошо оценено.

Я попытался обслуживаемый ответом в этом SO Вопроса:

Однако, это, кажется, бросить несколько ошибок ....

и я попытался еще несколько решений от нескольких SO Вопросов, т.е. , Array sum of value based on same key, How to sum values via the same key and group by other key и многое другое ...

Другим близко один был такой: How to sum same array in 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 argumentsundefined offsets и многое другое

запроса Смиренно для любого предложения.

Большого спасибо

+1

Ну первое, что вы можете сделать, чтобы помочь себе, это выбрать лучше имена переменных; подумайте о том, что означает $ f, $ I, $ v и т. д., на самом деле * означает *, и посмотрите, как читается ваш код, когда вы их подставляете. Создайте также промежуточные переменные, чтобы разбить трудночитаемые выражения типа '$ array2 [$ v ['Aln']] ['score_good_answers'] 'на несколько шагов, с именем, для которого представлено каждое значение по пути. – IMSoP

+0

@IMSoP, Извините за беспорядок, я получил эти имена 'var' из SO-вопроса, который я пытался использовать ... Thanx для обозначения этого –

+0

Пожалуйста, используйте var_export вместо var_dump при вставке в SO, он использует формат, который может быть скопировано непосредственно в php ... – rjdown

ответ

1

Вы можете использовать этот код:

$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 
     ) 

) 
+0

AMAZING !!! ..... Ты мужчина ... Работал как VOODOO !!! (Принято) –

+0

Мужчина просто хочет добавить другое спасибо .. !! –

+0

Добро пожаловать! – vicente

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); 
0

Если это итеративный структура, как в вашем примере вы можете сделать это:

$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']; 
     } 
    } 
} 
Смежные вопросы