PHPKonf: Istanbul PHP Conference 2017

max

(PHP 4, PHP 5, PHP 7)

max最大値を返す

説明

mixed max ( array $values )
mixed max ( mixed $value1 , mixed $value2 [, mixed $... ] )

パラメータとして配列をひとつだけ渡した場合は、max() は配列の中で最も大きい数値を返します。 ふたつ以上のパラメータを指定した場合は、max() はそれらの中で最も大きいものを返します。

注意:

異なる型の値を比較する際には、 標準の比較ルールに従います。 たとえば、数値形式でない stringinteger と比較するときには、数値 0 と評価します。 しかし、数値形式でない string どうしを比較するときには、アルファベット順で評価します。 返される値は、何も変換をしていない、元の型の値となります。

警告

異なる型の値を引数として渡す際には注意しましょう。 max() が予期せぬ結果を返す可能性があるからです。

パラメータ

values

値を含む配列。

value1

任意の 比較可能な 値。

value2

任意の 比較可能な 値。

...

任意の 比較可能な 値。

返り値

max() は、パラメータとして渡した値の中で、標準の比較ルールに従って最大になるものを返します。 異なる型で同じ値と評価される複数の値 (0'abc' など) があった場合は、関数に最初に渡されたほうを返します。

空の配列を渡した場合は FALSE を返し、 E_WARNING が発生します。

例1 max() の使用例

<?php
echo max(23167);  // 7
echo max(array(245)); // 5

// 'hello' を int と比較するときは、0 と評価します。ふたつの値が
// 等しくなるので、パラメータを渡した順によって結果が決まります
echo max(0'hello');     // 0
echo max('hello'0);     // hello

// -1 と 0 の比較なので、'hello' のほうが大きくなります
echo max('hello', -1);    // hello

// 長さが異なる複数の配列を渡すと、いちばん長い配列を返します
$val max(array(222), array(1111)); // array(1, 1, 1, 1)

// 同じ長さの複数の配列を渡すと、max はその要素を左から
// 辞書順に比較します。この例では 2 == 2 ですが 5 > 4 となります
$val max(array(248), array(251)); // array(2, 5, 1)

// 配列と配列でない値が渡された場合、常に
// 配列が最大と判定されます。
$val max('string', array(257), 42);   // array(2, 5, 7)

// 一方の値が NULL や boolean の場合、それを他の値と比較するときには、
// もう一方の値の型が何であるかにかかわらず、FALSE < TRUE というルールを使います。
// 以下の例では、-10 は TRUE と評価されます。
$val max(-10FALSE); // -10

// 一方 0 は FALSE と評価されるので、TRUE よりは小さいとみなされます。
$val max(0TRUE); // TRUE
?>

参考

  • min() - 最小値を返す
  • count() - 変数に含まれるすべての要素、 あるいはオブジェクトに含まれる何かの数を数える

add a note add a note

User Contributed Notes 19 notes

up
18
Alex Rath
6 years ago
Notice that whenever there is a Number in front of the String, it will be used for Comparison.

<?php

  max
('7iuwmssuxue', 1); //returns 7iuwmssuxu
 
max('-7suidha', -4); //returns -4

?>

But just if it is in front of the String

<?php

  max
('sdihatewin7wduiw', 3); //returns 3

?>
up
6
keith at bifugi dot com
6 months ago
The simplest way to get around the fact that max() won't give the key is array_search:

<?php
$student_grades
= array ("john" => 100, "sarah" => 90, "anne" => 100);
$top_student = array_search(max($student_grades),$student_grades); // john
?>

This could also be done with array_flip, though overwriting will mean that it gets the last max value rather than the first:

<?php
$grades_index
= array_flip($student_grades);
$top_student = $grades_index[max($student_grades)]; // anne
?>

To get all the max value keys:

<?php
$top_students
= array_keys($student_grades,max($student_grades)); // john, anne
?>
up
15
costinu
4 years ago
max(null, 0) = null
max(0, null) = 0
up
8
volch5 at gmail dot com
2 years ago
max() (and min()) on DateTime objects compares them like dates (with timezone info) and returns DateTime object.
<?php
$dt1
= new DateTime('2014-05-07 18:53', new DateTimeZone('Europe/Kiev'));
$dt2 = new DateTime('2014-05-07 16:53', new DateTimeZone('UTC'));
echo
max($dt1,$dt2)->format(DateTime::RFC3339) . PHP_EOL; // 2014-05-07T16:53:00+00:00
echo min($dt1,$dt2)->format(DateTime::RFC3339) . PHP_EOL; // 2014-05-07T18:53:00+03:00
?>

It works at least 5.3.3-7+squeeze17
up
5
johnphayes at gmail dot com
10 years ago
Regarding boolean parameters in min() and max():

(a) If any of your parameters is boolean, max and min will cast the rest of them to boolean to do the comparison.
(b) true > false
(c) However, max and min will return the actual parameter value that wins the comparison (not the cast).

Here's some test cases to illustrate:

1.  max(true,100)=true
2.  max(true,0)=true
3.  max(100,true)=100
4.  max(false,100)=100
5.  max(100,false)=100
6.  min(true,100)=true
7.  min(true,0)=0
8.  min(100,true)=100
9.  min(false,100)=false
10. min(100,false)=false
11. min(true,false)=false
12. max(true,false)=true
up
7
php at rijkvanwel dot nl
5 years ago
To get the largest key in an array:

<?php
$array
= array( 0 => 'first', 1=> 'second', /* ... */ 99 => 'nth' );
$max_key = max( array_keys( $array ) ); // 99
?>
up
6
ReVo_
2 years ago
Sometimes you could need to get the max from an array which looks like this:

<?php
$arrTest
= array(
    array(
"day" => 1, "b" => 10 ),
    array(
"day" => 2, "b" => 43 ),
    array(
"day" => 3, "b" => 2 ),
    array(
"day" => 4, "b" => -3 ),
    array(
"day" => 5, "b" => 4 ),
    array(
"day" => 6, "b" => -5 )
);
?>
all max functions i see around don't provide a way to get the max value of the values in (example) key "b"

<?php
function maxValueInArray($array, $keyToSearch)
{
   
$currentMax = NULL;
    foreach(
$array as $arr)
    {
        foreach(
$arr as $key => $value)
        {
            if (
$key == $keyToSearch && ($value >= $currentMax))
            {
               
$currentMax = $value;
            }
        }
    }

    return
$currentMax;
}

//                                            array       key
$value = maxValueInArray($arrTest, "b");

?>

output: 43
up
7
michaelangel0 at mail.com
9 years ago
Matlab users and others may feel lonely without the double argument output from min and max functions.

To have the INDEX of the highest value in an array, as well as the value itself, use the following, or a derivative:

<?php
function doublemax($mylist){
 
$maxvalue=max($mylist);
  while(list(
$key,$value)=each($mylist)){
    if(
$value==$maxvalue)$maxindex=$key;
  }
  return array(
"m"=>$maxvalue,"i"=>$maxindex);
}
?>
up
4
ries at vantwisk dot nl
8 years ago
I had several occasions that using max is a lot slower then using a if/then/else construct. Be sure to check this in your routines!

Ries
up
6
marcini
7 years ago
Note that max() can compare dates, so if you write something like this:

<?php
$dates
= array('2009-02-15', '2009-03-15');
echo
max($dates);
?>

you will get: 2009-03-15.
up
4
harmor
8 years ago
A way to bound a integer between two values is:

<?php
function bound($x, $min, $max)
{
     return
min(max($x, $min), $max);
}
?>

which is the same as:

<?php
$tmp
= $x;
if(
$tmp < $min)
{
   
$tmp = $min;
}
if(
$tmp > $max)
{
    
$tmp = $max;
}
$y = $tmp;
?>

So if you wanted to bound an integer between 1 and 12 for example:

Input:
<?php
$x
= 0;
echo
bound(0, 1, 12).'<br />';
$x = 1;
echo
bound($x, 1, 12).'<br />';
$x = 6;
echo
bound($x, 1, 12).'<br />';
$x = 12;
echo
bound($x, 1, 12).'<br />';
$x = 13;
echo
bound($x, 1, 12).'<br />';
?>

Output:
1
1
6
12
12
up
3
levim at php dot net
4 years ago
<?php
/**
* @param array $array
*
* @return int|null Returns the largest value of the array. Returns NULL if no
*     integers are found.
*/
function array_max_recursive(array $array) {
   
$max = NULL;
   
$stack = array($array);

    do {
       
$current = array_pop($stack );
        foreach (
$current as $value) {
            if (
is_array($value)) {
               
$stack[] = $value;
            } elseif (
filter_var($value, FILTER_VALIDATE_INT) !== FALSE) {
               
// max(NULL, 0) returns NULL, so cast it
               
$max = (int) max($max, $value);
            }
        }

    } while (!empty(
$stack));

    return
$max;
}
?>

- This function is not actually recursive, but fulfills the requirement that it works on sub-arrays.  I do this because PHP is not very good at recursion.  I also did it because I enjoy doing things this way. 
- It returns something of type int, never a string representation of an int. The exception is when you provide an array that does not contain any integers.  It will then return NULL.
- It ignores non-array, non-int values.
up
3
toon dot baeyens at gmail dot com
4 years ago
A little function for multi-dimensional arrays:
<?php
function amax($array){
    if(
is_array($array)){
        foreach(
$array as $key => $value){
           
$array[$key] = amax($value);
        }
        return
max($array);
    }else{
        return
$array;
    }
}
?>
up
2
sun at drupal dot org
5 years ago
Note that max() throws a warning if the array is empty:

<?php
$a
= array();
max($a);
// Warning: max(): Array must contain at least one element
?>

So make sure your data isn't empty.
up
2
Marcus Zacco
8 years ago
This code loops through seven arrays and finds the highest average value within those arrays - and changes the font color for it. Great for highlighting.

The biggest take-away is this the row
if($average[$i] == max($average))

The number_format just rounds the numbers to 0 decimal points.

<?php
for ( $i = 0; $i <= 6; $i++) {
 
$num = $i+1;
  if(
$average[$i] == max($average)) {
    echo
"Value ".$num.": <font color='red'>".number_format($average[$i], 0, '.', '')." % </font<br>";
  } else {
    echo
"Value ".$num.": ".number_format($average[$i],0,'.','')." %<br>";
  }
}
?>

### OUTPUT

Value 1: 52 %
Value 2: 58 %
Value 3: 56 %
Value 4: 73 %
Value 5: 77 % <- this 77 is highlighted in red
Value 6: 71 %
Value 7: 75 %
up
-1
grillen at abendstille dot at
6 years ago
max only accepts not empty arrays.

if you work a lot with numerical arrays and with max, this function may come in handy:

<?php
if (!function_exists('emax')) {
    function
emax($arr) {
        if (!
is_array($arr)) return call_user_func_array('max', func_get_args());
        if (
count($arr) == 0) return 0;
        return
max($arr);
    }
}
?>
up
-2
Alex Stanhope
6 years ago
If you want to test whether x lies within two bounds:

<?php
   
static function isInRange($x, $y1, $y2) {
        return( (
$x >= min($y1, $y2)) && ($x <= max($y1, $y2)) );
    }

//called by:

  
class::isInRange(10,12,2);
//or
  
$this->isInRange(10,12,2);
//or (drop static)
  
isInRange(10,12,2);

//simple test function:

   
static function unit_isInRange() {
       
$output = array();
       
$inputlist[] = array(10, 12, 2, true);
       
$inputlist[] = array(13, 12, 2, false);
       
$inputlist[] = array(2, -2, 2, true);
       
$inputlist[] = array(2, -8, -2, false);
        foreach(
$inputlist as $input) {
           
$output[] = array(
               
'input' => array($input[0], $input[1], $input[2]),
               
'output' => self::isInRange($input[0],$input[1],$input[2]),
               
'expected' => $input[3],
            );
        }
        return(
$output);
    }
?>
up
-3
johnmott59 at hotmail dot com
9 years ago
To find the maximum value from a set of 1-dimensional arrays, do this:

<?php
$d1
= array(450,420,440,430,421);
$d2 = array(460,410,410,430,413,375,256,411,656);
$d3 = array(430,440,470,435,434,255,198);

$t = max(max($d1),max($d2),max($d3));
// $t is 656
?>

The inner max() functions operate on the arrays, the outer max compares the numeric results of the inner ones.
up
-10
jeremi23 at gmail dot com
9 years ago
max on a an array with key/values

<?php
$tmp
= array(1 => 5, 2=> 3);
echo
max($tmp);
?>

this return 5, so the max is done on the values.
To Top