如何在多维数组中找到最高值?

时间:2017-02-02 10:06:52

标签: php recursion multidimensional-array max

我有以下数组:

$ar3 = array(123, array(12, 665, array(77, 255, 98, 56), 8), 1155, 676);

我需要在递归的帮助下比较所有元素以找到最大值。

我设法在最深的数组中找到最高值:

$ar3 = array(123, array(12, 665, array(77, 255, 98, 56), 8), 1155, 676); 

function arr_max_rec($ar3)
{
    $max = $ar3[0];
    foreach ($ar3 as $key => $value){
        if ($max < $ar3[$key] and !is_array($value)){
            $max = $ar3[$key];
        }
        elseif (is_array($ar3[$key])){
            return arr_max_rec($ar3[$key]);
        }
    }return $max;
}
echo arr_max_rec($ar3);

但我需要比较所有数字并找到最高数字。数组的深度可以是任意值。

5 个答案:

答案 0 :(得分:3)

以下方法可行:

<?php

function arr_max_rec($ar3)
{   //                  \
    //                   |
    //     / reduce the input array to a single value using
    //     |             |
    //     |             |    / the given callback
    //     |             |    |
    return array_reduce($ar3, function ($a, $b) {
        //                                /
        //  / return the           -------
        //  |                     /
        //  |   / max value of $a, $b. But if $b
        //  |   |
        //  |   |        / is an array, recurse first
        //  |   |        |              |
        return max($a, is_array($b) ? arr_max_rec($b) : $b);

    }, PHP_INT_MIN);
}

演示:https://3v4l.org/OUsmH

答案 1 :(得分:2)

您可以尝试使用递归函数

    <?php

    $ar3=array(123, array(12, 665, array(77, 255, 98, 56), 8), 1155, 676); 

    function highestValue($ar3) {
       foreach($ar3 as $key => $value) {
           if (is_array($value)) {
               $ar3[$key] = highestValue($value);
           }
       }

         return max($ar3);
    }

    echo highestValue($ar3); //1155

答案 2 :(得分:1)

PHP已经提供了本机递归函数来遍历称为leaf nodes的多维数组的所有array_walk_recursive()。这提供了干净,简洁,直观的代码行。当未来的开发人员查看您的代码时,他们将立即知道您的代码行将要实现的目标而无需遵循多行代码和逻辑。这样可以实现更好的可维护性,并表明您了解完成任务的直接工具。

$max建立基值或默认值后,您编写处理条件逻辑的user-defined function(或“闭包”)。关于闭包的怪事是它们有自己的“作用域”-这意味着其中的变量在函数外部不可用(至少,并非没有帮助)。尽管global的用意良好,但通常不建议使用use()声明(在许多情况下,这是一种不良习惯,并且每次迭代都会读取该行),因此&将用作导入变量的方式和$ar3 = array(123, array(12, 665, array(77, 255, 98, 56), 8), 1155, 676); $max = null; // declare a non-integer or minimum value here array_walk_recursive($ar3, function($v)use(&$max){if($max === null || $v > $max) $max = $v;}); echo $max; // output: 1155 (使变量为“ modifiable by reference”)将用作将变量从函数作用域导出回全局作用域的一种方法。

代码:(Demo

array_walk_recursive()

* true返回falsereturn。您不能在闭包内使用$max$max移到全局范围。

**如果您最初将0声明为$max === null(因为您不希望出现负值),那么您就不需要在条件表达式中进行object检查

*如果您要处理过深的多维数组(如数百个级别),则有可能发生堆栈崩溃。我试图找到有关此声明的参考,但在任何地方都找不到链接-虽然我确实在某处阅读了该链接。

答案 3 :(得分:-1)

<?php
$ar3 = array(123, array(12, 665, array(77, 255, 98, 56), 8), 1155, 676); 
$first = intval($ar3[0]);
$min = '' ;
$max = '' ;
foreach($ar3 as $data) {
    $array= intval($data);
    if($array<= $min ) {
        $min =  $array;
    }
    if($array> $max ) {
        $max =  $array;
    }
}
echo "  max = $max \n " ;
?>

Live Demo

答案 4 :(得分:-1)

  

以下@Koiten是您的答案根据以下内容更正您的代码   之一:

<?php
    $ar3 = array(123, array(12, 665, array(77, 255, 98, 56), 8), 1155, 676); 
    function arr_max_rec($ar3){
        $max = $ar3[0];
        foreach($ar3 as $val){          
            if(!is_array($val) && $max < $val){
                $max = $val;
            }
            else if(is_array($val)){
                arr_max_rec($val);
            }
        }
        return $max;
    }
    echo arr_max_rec($ar3); 
?>
  

输出:1155