PHP编程挑战-代码生成器不接受

PHP编程挑战-代码生成器不接受,php,recursion,Php,Recursion,PHP中提供了一个数组,其中包含正整数和/或正整数的递归嵌套数组。例如,可以将其初始化为: $arr = array(array(141,151,161), 2, 3, array(101, 202, array(303,404))); 编写一个函数“function MaxArray($arr)”,返回$arr中包含的最大值或嵌套在$arr中的某个数组。在本例中,返回值应为404 function MaxArray($arr){ static $x = 0; foreac

PHP中提供了一个数组,其中包含正整数和/或正整数的递归嵌套数组。例如,可以将其初始化为:

$arr = array(array(141,151,161), 2, 3, array(101, 202, array(303,404)));
编写一个函数“function MaxArray($arr)”,返回$arr中包含的最大值或嵌套在$arr中的某个数组。在本例中,返回值应为404

function MaxArray($arr){

    static $x = 0;

    foreach($arr as $array){ 
   
        if(is_array($array)) $x = MaxArray($array);            
        else if($array > $x) $x = $array;
        
    }
    return $x;    
}

//additional output just for testing
$arr = array(array(141,5651,161), 2, 45446, array(101, 202, array(303,4)));
//additional output just for testing
print MaxArray($arr);
每次我运行它时它都会工作,但是在线代码生成器不会接受。这是这一部分的错误还是我

另外,我个人想对stackoverflow上的所有人说声谢谢,这是一个非常棒的网站。四年前,我对编程一无所知,现在我从头开始构建了它,我正在用java编写android应用程序

更新: 这个问题来自我参加的一个在线测试。没有显示错误信息,但是代码生成器只是给出了错误答案的回答。因此,我不适合这个问题

我想在上诉之前检查我的解决方案

# so... this works well enough
$arr = array(array(141,5651,161), 2, 45446, array(101, 202, array(303,4)));
print MaxArray($arr);  // outputs 45446

print "\n";

# but now...let's try it again.  In the same script.  *gasp!*
$arr2 = array(42);
print MaxArray($arr2);  // outputs 45446 (!!!)
问题是静态变量;在函数调用之间,它没有被清除。所以以前的结果会影响未来的结果。这几乎肯定是不正确的,并且肯定会导致一个知识渊博的人类法官拒绝您的代码

去掉静态变量。你可以把它作为一个参数传递,你可以简单地与子结果进行比较,就像这里的另一个答案所建议的那样。。。或者你可以用闭包和
数组\u walk\u recursive
:)来炫耀一下


为什么对局部变量
x
使用
static
?在线代码生成器会出现什么错误?但是,您的代码在
PHP5.3.10-1ubuntu3.7
@Juhana中对我有效好了,我现在明白了。我只是习惯于使用
{}
块,而不是不使用。你能给我一个在线测试的链接吗?@hek2mgl expertrating.com
function MaxArray($arr) {
    $max = -1;
    array_walk_recursive($arr, function($x) use (&$max) {
        if ($x > $max) $max = $x;
    });
    return $max;
}
<?php
$arr = [[141, 151, 161], 2, 3, [101, 202, [303, 404]]]

/**
 * @param $input
 * @return int
 */
function getActMax($input)
{
    if ( ! is_array($input))
    {
        return $input;
    } else
    {
        return findMax($input);
    }
}

/**
 * @param array $inputs
 * @return int
 */
function findMax(array $inputs)
{
    //Maybe the first item in the list is the biggest, this is our current max value
    $max = getActMax(current($inputs));
    foreach ($inputs as $v)
    {
        //If we found a bigger, change our max value
        if (getActMax($v) > $max)
        {
            $max = getActMax($v);
        }
    }

    return (int)$max;
}

var_dump(findMax($arr));