2

I have this result inside my foreach loop:

Tonsilitis
Tonsilitis
Laryngitis
Rhinosinusitis Akut
Rhinosinusitis Akut
Rhinosinusitis Akut
Common Cold
Common Cold
Common Cold
Rhinitis Alergi

This is my script:

foreach ($results as $data) :
   $final = $data->nama_diagnosis . '<br>';
   echo $final;
endforeach;

My question is, how can i count the same word in my loop or outside the loop. Can i do that? give me the solution please. As a result i want to count them like this:

Tonsilitis = 2
Laryngitis = 1
Rhinosinusitis Akut = 3
Common Cold = 3
Rhinitis Alergi = 1

Or maybe i can filter the same word so i get only the most words, like Rhinosinusitis Akut and Common Cold. Please help me. Thanks

0

4 Answers 4

5

You can try something like this, iterating through array with foreach loop and using a ternary operator with isset to safely assign and increment each occurrence:

$count = array();
foreach ($results as $result)
    isset($count[$data]) ? $count[$data]++ : $count[$data] = 1;

Example

Sign up to request clarification or add additional context in comments.

2 Comments

It seems that $data is an object in OP's loop and has to use: $data->nama_diagnosis but other then that, very nice trick with the isset combined with the ternary operator! +1
@Rizier123 : It was kinda odd to me that this approach works too.
3

In foreach loop save words and their count into array, then make another loop and write the amounts.

<?php

$results = array(
    array('nama_diagnosis' => 'Tonsilitis'),
    array('nama_diagnosis' => 'Tonsilitis'),
    array('nama_diagnosis' => 'Laryngitis'),
    array('nama_diagnosis' => 'Rhinosinusitis Akut'),
    array('nama_diagnosis' => 'Rhinosinusitis Akut'),
    array('nama_diagnosis' => 'Rhinosinusitis Akut'),
    array('nama_diagnosis' => 'Common Cold'),
    array('nama_diagnosis' => 'Common Cold'),
    array('nama_diagnosis' => 'Common Cold'),
    array('nama_diagnosis' => 'Rhinitis Alergi')
);

$res = array();
foreach ($results as $words) {  // changed $word to $words
    foreach ($words as $word) { // this foreach added
        if (isset($res[$word])) {
            $res[$word] += 1;
        } else {
            $res[$word] = 1;
        }
    } // end of nested foreach which was added
}

foreach ($res as $word => $count) {
    echo $word . ' (' . $count . ')<br>';
}

/*
    output:

    Tonsilitis (2)
    Laryngitis (1)
    Rhinosinusitis Akut (3)
    Common Cold (3)
    Rhinitis Alergi (1)
*/

?>

6 Comments

This is my array.. can i convert it? Array ( [0] => Array ( [nama_diagnosis] => Tonsilitis ) [1] => Array ( [nama_diagnosis] => Tonsilitis ) [2] => Array ( [nama_diagnosis] => Laryngitis ) [3] => Array ( [nama_diagnosis] => Rhinosinusitis Akut ) [4] => Array ( [nama_diagnosis] => Rhinosinusitis Akut ) [5] => Array ( [nama_diagnosis] => Rhinosinusitis Akut ) [6] => Array ( [nama_diagnosis] => Common Cold ) [7] => Array ( [nama_diagnosis] => Common Cold ) [8] => Array ( [nama_diagnosis] => Common Cold ) [9] => Array ( [nama_diagnosis] => Rhinitis Alergi ) ) Tonsilitis (2)
@RK26: I've updated my answer, nested foreach was added (and in the first one I've changed $word to $words - foreach ($results as $words) {...}).
Can i only show one word with the most count? is it possible?
@RK26: See the sort function.
When i use rsort($res), the order is correct, but the words become a number aswell
|
1

Try with -

$counts = array();
foreach ($results as $data) :
   $final = $data->nama_diagnosis . '<br>';
   if (array_key_exists($data->nama_diagnosis, $counts)) {
        $counts[$data->nama_diagnosis] += 1;
   } else {
        $count[$data->nama_diagnosis] = 1;
   }
endforeach;

foreach ($counts as $key => $val) { 
    echo $key.' = '.$val;
}

Comments

0

This should work for you:

<?php

    $results = array("Tonsilitis", "Tonsilitis", "Laryngitis", "Rhinosinusitis Akut", "Rhinosinusitis Akut", "Rhinosinusitis Akut", "Common Cold", "Common Cold", "Common Cold", "Rhinitis Alergi");
    $counter = array();


    foreach ($results as $data):
        if(in_array($data->nama_diagnosis, array_flip($counter)))
            $counter[$data->nama_diagnosis]++;
        else
            $counter[$data->nama_diagnosis] = 1;
    endforeach;

    foreach ($counter as $key => $data)
       echo $key . " = " . $data . "<br />"; 

?>

Output:

Tonsilitis = 2
Laryngitis = 1
Rhinosinusitis Akut = 3
Common Cold = 3
Rhinitis Alergi = 1

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.