arrays - Use a php function to get the sum per category and counter of scores?

725

For a Google Chart I need to get the Sum of Scores Per Period and a divider which is the sum of Counting a Score per period per sector

$inputArray = 
          [
            ['period' => 'period6','sector' => 'SI', 'score' => 3],
            ['period' => 'period4','sector'=> 'B K','score'=> 2],
            ['period' => 'period2','sector' => 'FS','score' => 2],
            ['period' => 'period5','sector' => 'DD','score' => ''],
            ['period' => 'period3','sector' => 'B K','score' => 3],
            ['period' => 'period4','sector' => 'SI','score' => 0],
            ['period' => 'period1','sector' => 'B K', 'score' => 0],
            ['period' => 'period1','sector' => 'SI','score' => 3],
            ['period' => 'period4','sector' => 'FS','score' => ''],
            ['period' => 'period2','sector' => 'FS','score' => 2],
            ['period' => 'period5','sector' => 'DD','score' => 3],
            ['period' => 'period3','sector' => 'B K','score' => 3],
            ['period' => 'period4','sector' => 'SI','score' => ''],
            ['period' => 'period1','sector' => 'B K', 'score' => 1],
            ['period' => 'period1','sector' => 'SI','score' => ''],
            ['period' => 'period4','sector' => 'FS','score' => 2],
        ];

Here i loop through the array and first set each sector per period to 0 and for every iteration i add the score. But I also need a counter which just counts the times a score has been set >= 0. I need this because the Google Chart bars = sum(scoresPerCategory per Period) / (#times scores have been given Per Cat Per Period) and group

 $output = [];
    foreach ($inputArray as $key => $value) {
        // Initialize Sum per Period =0
        // 
        if (empty($output[$value['period']])) {
            $output[$value['period']] = ['SI' => 0, 'B K' => 0, 'FS' => 0, 'DD' => 0];
            $output[$value['period']]['score_counter_'.$value['sector']] = 0;  
        }
        // Total Score
        $output[$value['period']][$value['sector']] += $value['score'];
        // Only score values with with zero or greater
        // Just a Counter NOT total score
        //  +1 Per Sector Per Period 
        if ($value['score'] > 0)
            $output[$value['period']]['score_counter_' . $value['sector']] += 1;
    }
print_r($output);

But this doesn't give me the right output

[period6] => Array
        (
            [SI] => 3
            [B K] => 0
            [FS] => 0
            [DD] => 0
            [score_counter_SI] => 1
        )

    [period4] => Array
        (
            [SI] => 0
            [B K] => 2
            [FS] => 2
            [DD] => 0
            [score_counter_B K] => 1
            [score_counter_FS] => 1
        )

    [period2] => Array
        (
            [SI] => 0
            [B K] => 0
            [FS] => 4
            [DD] => 0
            [score_counter_FS] => 2
        )

    [period5] => Array
        (
            [SI] => 0
            [B K] => 0
            [FS] => 0
            [DD] => 3
            [score_counter_DD] => 1
        )

    [period3] => Array
        (
            [SI] => 0
            [B K] => 6
            [FS] => 0
            [DD] => 0
            [score_counter_B K] => 2
        )

    [period1] => Array
        (
            [SI] => 3
            [B K] => 1
            [FS] => 0
            [DD] => 0
            [score_counter_B K] => 1
            [score_counter_SI] => 1
        )

Not every array has a score_counter_xx which I expected. I am still struggling with arrays :(

Bar=Sum(Sector)/#scoresgiven Per Period

[EDIT] with my bigger input array the simple counter doesn't seem to work. My simple logic:if ($value['score'] > 0) $output[$value['period']]['score_counter_' . $value['sector']] += 1;

puts the same number for every ['score_counter_' . $value['sector']

23

Answer

Solution:

If you're trying to initialize a score_counter_XX entry for every score type, you can do it in this line:

$output[$value['period']] = ['SI' => 0, 'B K' => 0, 'FS' => 0, 'DD' => 0];

...by adding in the zero counts for those type:

$output[$value['period']] = ['SI' => 0, 'B K' => 0, 'FS' => 0, 'DD' => 0, 'score_counter_SI' => 0, 'score_counter_B K' => 0, 'score_counter_FS' => 0, 'score_counter_DD' => 0];

That will initialize those counters.

People are also looking for solutions to the problem: php - Http failure response for (unknown url): 0 Unknown Error

Source

Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.