繁体   English   中英

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

[英]How to find the highest value in a multidimensional array?

我有以下数组:

$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);

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

以下将起作用:

<?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

您可以尝试使用递归函数

    <?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

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

在为$max建立基值或默认值之后,您将编写一个处理条件逻辑的用户定义函数 (或“ closure”)。 关于闭包的怪事是它们有自己的“作用域”-这意味着其中的变量在函数外部不可用(至少,并非没有帮助)。 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

* array_walk_recursive()返回truefalse 您不能在闭包内部使用return$max移至全局范围。

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

*如果您要处理过深的多维数组(如数百个级别),则有可能发生堆栈崩溃。 我试图找到此主张的参考,但我找不到任何链接,尽管我确实在某处阅读过。

<?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 " ;
?>

现场演示

@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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM