【问题标题】:How to find the highest value in a multidimensional array?如何在多维数组中找到最大值?
【发布时间】:2017-06-19 08:25:26
【问题描述】:

我有以下数组:

$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 recursion multidimensional-array max


    【解决方案1】:

    PHP 已经提供了一个原生递归函数来遍历名为array_walk_recursive() 的多维数组的所有leaf nodes。这提供了干净、简洁、直观的代码行。当未来的开发人员查看您的代码时,他们将立即知道您的代码行试图实现的目标,而无需遵循多行代码和逻辑。这将提高可维护性,并表明您了解手头任务的直接工具。

    在为$max 建立一个基本值或默认值之后,您编写一个处理条件逻辑的user-defined function(或“闭包”)。闭包的有趣之处在于它们有自己的“范围”——这意味着其中的变量在函数之外不可用(至少,并非没有帮助)。 global 声明通常是不可取的(在许多情况下是一个坏习惯,并且每次迭代都会读取该行),即使它们是善意的,所以 use() 将用作导入变量的方法,&amp; (这使得变量“modifiable by reference”)将用作将变量从函数范围导出回全局范围的方法。

    代码:(Demo)

    $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

    *如果您正在处理过深的多维数组(例如数百个级别),则可能会发生堆栈崩溃。我试图找到这个声明的参考,但我在任何地方都找不到链接——不过我确实在某个地方读过它。

    【讨论】:

      【解决方案2】:

      @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

      【讨论】:

      • 很抱歉,它不起作用。尝试更改 255 --> 2255,你会看到。它仍然会输出 1155。
      【解决方案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

      【讨论】:

        【解决方案4】:

        你可以尝试使用递归函数

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

        【讨论】:

        • 你可以使用return max($ar3);代替sortarray_pop
        • @antesoles 更新了代码并尝试了它也可以正常工作
        【解决方案5】:
        <?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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-24
          • 2021-02-18
          • 2018-04-26
          • 1970-01-01
          • 2018-09-14
          相关资源
          最近更新 更多