How to find the mode of an array in PHP

11,765

Solution 1

The mode of a numerical set is the number that occurs the most often. You can do this with PHP using code similar to the following:

$values = array_count_values($valueArray); 
$mode = array_search(max($values), $values);

Solution 2

Simple!

$arr = array(4,6,7,1,4,7,4,7,1);
$freq = array();
for($i=0; $i<count($arr); $i++)
{
   if(isset($freq[$arr[$i]])==false)
   {
       $freq[$arr[$i]] = 1;
   }
   else
   {
       $freq[$arr[$i]]++;
   }
}
$maxs = array_keys($freq, max($freq));

for($i=0; $i<count($maxs); $i++)
{
   echo $maxs[$i] . ' ' . $freq[$maxs[$i]];
   echo '<br />';
}
Share:
11,765
Admin
Author by

Admin

Updated on June 15, 2022

Comments

  • Admin
    Admin almost 2 years

    I have an array that has been sorted from low to high which has over 260k values in. I have found out the mean(average) and median of the array just need to find out the mode?

    I cannot use any mathematical functions that PHP has, it has to be all done manually.

    I would like it so there could be just one value that is the mode but then there can be multiple values that can be the mode. I also need to be able to record the number of times that the value is stored. For example the number 51 appears 6 times so I can print both values.

    This is my code so far:

    $amountRecords = 0;
    $totalValue = 0;
    $valueArray = array();
    
    // reads in csv file
    $handle = fopen('Task1-DataForMeanMedianMode.csv', 'r');
    // to skip the header names/values
    fgetcsv($handle);
    
    // creates array containing variables of csv file in ascending order
    while(($row = fgetcsv($handle, "\r")) != FALSE)
    {
    
        // if amountRecords equals 0
        if($amountRecords == 0)
        {
    
            // adds value from csv to array
            $valueArray[] = $row[1];
    
        } // else amountRecords does not equal 0
        else 
        {
    
            // if the value in array location before is greater than the current value from the csv file
            if($valueArray[$amountRecords - 1] > $row[1])
            {
    
                 // the current array location becomes the one in the location before
                 $valueArray[] = $valueArray[$amountRecords - 1];
                 // add the value from the csv to the location before
                 $valueArray[$amountRecords - 1] = $row[1];
    
             } // if the value in the location before is not greater than the current value in the csv file
             else 
             {
    
                 // adds value from csv to array
                 $valueArray[] = $row[1];
    
             }
    
        }
    
        // calculates the total value of the values in csv file
        $totalValue = $totalValue + $row[1];
        // calculates the number of values in the csv file
        $amountRecords++;
    
    }    
    
    // calculate average value of payments
    $averageValue = $totalValue / $amountRecords;
    // limit integer to 2 decimal place
    $average = number_format($averageValue,2,'.','');
    
    // finds middle value
    $middle = floor(($amountRecords / 2) - 1);
    
    // calculates the median value
    // if array size is even
    if($amountRecords % 2 == 0)
    {
    
        // calculates median
        $median = $valueArray[$middle];
    
    } 
    else // if array size is odd
    {
    
        // calculate low and high values
        $low = $valueArray[$middle];
        $high = $valueArray[$middle + 1];
        // calculates median
        $median = (($low + $high) / 2);
    
    }
    
    // works out mode
    // creates array count
    $count = array();
    // for each value in the valueArray
    foreach( $valueArray as $value )
    {
    
        if( isset( $count[$value] ))
        {
    
            $count[$value]++;
    
        }
        else
        {
    
            $count[$value] = 1;
    
        }
    
    }
    
    $mostCommon = "";
    $iter = 0;
    
    foreach( $count as $k => $v )
    {
    
         if( $v > $iter )
         {
    
             $mostCommon = $k;
             $iter = $v;
    
         }
    
    }
    
    $modeArray = array( "mode" => $mostCommon , "count" => $iter );
    
  • Admin
    Admin over 11 years
    Like I said in my post it has to be done manually without using any mathematical functions PHP has. This includes count and max and min etc.
  • White Elephant
    White Elephant over 11 years
    Have a go at working out the mode and then we can help you out with it. Based on the code above, it looks like you haven't even attempted it.
  • Admin
    Admin over 11 years
    @WhiteElephant I have something but it only returns one value not multiple if there multiple. I have edited my original post with the added mode code that I have done.
  • kayla
    kayla almost 9 years
    This solution is good, but if there are more than one mode numbers, its only pick the first one of the order in the array. I am trying to get all numbers that occurs the most often, for example {2,2,3,3,1} -> I need to get 2 and 3. Can you have any other solution? Sorry for my poor English
  • 8ctopus
    8ctopus over 3 years
    solution with multiple modes: $values = array_count_values($cells); asort($values); $modes = array_keys($values, max($values));