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 />';
}
Author by
Admin
Updated on June 15, 2022Comments
-
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 over 11 yearsLike 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 over 11 yearsHave 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 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 almost 9 yearsThis 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 over 3 yearssolution with multiple modes:
$values = array_count_values($cells); asort($values); $modes = array_keys($values, max($values));