簡體   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