如何编写函数Max($ array),它返回$ array中包含的最大值或嵌套在$ array中的一些数组

时间:2010-02-22 07:39:00

标签: php

例如:

$array= array(array(141,151,161),2,3,array(101,202,array(303,606)));

输出:606

8 个答案:

答案 0 :(得分:3)

你需要的是递归遍历你的阵列;这意味着max函数不是递归的,不会“足够”。

但是,如果您查看the manual page of max上的用户注释,您会找到this note from tim,他建议使用此递归函数(引用)

function multimax( $array ) {
    // use foreach to iterate over our input array.
    foreach( $array as $value ) {

        // check if $value is an array...
        if( is_array($value) ) {

            // ... $value is an array so recursively pass it into multimax() to
            // determine it's highest value.
            $subvalue = multimax($value);

            // if the returned $subvalue is greater than our current highest value,
            // set it as our $return value.
            if( $subvalue > $return ) {
                $return = $subvalue;
            }

        } elseif($value > $return) {
            // ... $value is not an array so set the return variable if it's greater
            // than our highest value so far.
            $return = $value;
        }
    }

    // return (what should be) the highest value from any dimension.
    return $return;
}

在你的阵列上使用它:

$arr= array(array(141,151,161),2,3,array(101,202,array(303,404)));
$max = multimax($arr);
var_dump($max);

给予:

int 404

当然,这需要更多的测试 - 但它至少应该是一个开始。


(通过手册页上的用户注释总是一个好主意:如果你遇到问题,其他人可能已经遇到了这个问题;-))

答案 1 :(得分:2)

与Pascal的解决方案相同,只有Standard PHP Library

才能缩短
$arr= array(array(141,151,161),2,3,array(101,202,array(303,404)));
echo rmax($arr);

function rmax(array $arr) {
  $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr));
  // initialize $max
  $it->next(); $max = $it->current();
  // "iterate" over all values
  foreach($it as $v) {
    if ( $v > $max ) {
      $max = $v;
    }
  }
  return $max;
}

答案 2 :(得分:2)

http://www.java2s.com/Code/Php/Data-Structure/FindtheMaximumValueinaMultidimensionalArray.htm

function recursive_array_max($a) {
    foreach ($a as $value) {
        if (is_array($value)) {
            $value = recursive_array_max($value);
        }
        if (!(isset($max))) {
            $max = $value;
        } else {
            $max = $value > $max ? $value : $max;
        }
    }
    return $max;
}
$dimensional = array(
    7,
    array(3, 5),
    array(5, 4, 7, array(3, 4, 6), 6),
    14,
    2,
    array(5, 4, 3)
    );

$max = recursive_array_max($dimensional);

答案 3 :(得分:2)

$arr = array(array(141,151,161), 2, 3, array(101, 202, array(303,404)));
$callback = function ($value, $key) use (&$maximo) {
    if( $value > $maximo){
        $maximo = $value;
    }
};
array_walk_recursive($arr, $callback);
echo '<pre>'; print_r($maximo);``

答案 4 :(得分:1)

更优雅的解决方案:

function MaxArray($arr)
{
    function findMax($currentValue, $currentKey)
    {
        global $maxValue;
        $maxValue = ($currentValue > $maxValue ? $currentValue : $maxValue);
    }
    array_walk_recursive($arr, 'findMax');
    return $GLOBALS['maxValue'];
}

答案 5 :(得分:1)

这很简单

$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr));
$max = max(iterator_to_array($iterator, false));

答案 6 :(得分:0)

找到最大值,避免过多的递归:

function array_max(array $array) {
    $context = func_get_args();
    $max = -INF;

    while (!empty($context)) {
        $array = array_pop($context);
        while (!empty($array)) {
            $value = array_pop($array);
            if (is_array($value)) {
                array_push($context, $value);
            }
            elseif ($max < $value) {
                $max = $value;
            }
        }
    }

    return $max;
}

避免过多递归的更通用的方法:

function array_reduce_recursive($default, array $array, $callback = null) {
    $context = func_get_args();
    $count = func_num_args();
    if (is_callable(func_get_arg($count - 1))) {
        $callback = array_pop($context);
    }
    else {
        $callback = create_function('$x, $y', 'return $x < $y ? $y : $x;');
    }
    $reduced = array_shift($context);

    while (!empty($context)) {
        $array = array_pop($context);
        while (!empty($array)) {
            $value = array_pop($array);
            if (is_array($value)) {
                array_push($context, $value);
            }
            else {
                $reduced = $callback($reduced, $value);
            }
        }
    }

    return $reduced;
}

function array_max_recursive() {
    $args = func_get_args();
    $callback = create_function('$x, $y', 'return $x < $y ? $y : $x;');
    return array_reduce_recursive(-INF, $args, $callback);
}

通过这种方式,如果您正在寻找除最大数字之外的其他内容,则可以指定回调方法。此方法也需要几个数组。

当然,最终方式效率较低。

通过这种方式,您可以完全兼容许多PHP版本。

答案 7 :(得分:0)

function MaxArray($arr) {
    $maximum = 0;
    foreach ($arr as $value) {
        if (is_array($value)) {
            //print_r($value);
            $tmaximum = MaxArray($value);
            if($tmaximum > $maximum){
                $maximum = $tmaximum;
            }
        }
        else
        {
            //echo $value.'\n';
            if($value > $maximum){
                $maximum = $value;
            }
        }
    }
    return $maximum;
}