2010-02-22 3 views
2

예 : $ 배열에 포함 된 최대 값 또는 $ 배열 내에 중첩 된 몇 가지 배열을 반환 ($ 배열) :작성하는 방법에 기능을 최대

$array= array(array(141,151,161),2,3,array(101,202,array(303,606))); 

출력 : 당신이 필요로하는 무엇 (606)

+2

이전의 모든 게시물 보인다. 너 뭐 해봤 니? – ghostdog74

+0

+1 stackoverflow에 오신 것을 환영합니다 :) – Sarfraz

+1

@ ghostdog74 PHP5 온라인 시험 문제. – Egglabs

답변

2

같은 Standard PHP Library

$arr= array(array(141,151,161),2,3,array(101,202,array(303,404))); 
echo rmax($arr); 

function rmax(array $arr) { 
    $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr)); 
    // initialize $max 
    $it->next(); $max = $it->current(); 
    // "iterate" over all values 
    foreach($it as $v) { 
    if ($v > $max) { 
     $max = $v; 
    } 
    } 
    return $max; 
} 
+0

@volkerk 감사합니다. – Egglabs

3

재귀를하는 것입니다 당신의 배열을 통과하십시오; 이는 재귀가 아닌 max 함수가 "충분"하지 않음을 의미합니다.

하지만, 당신이 the manual page of max에 대한 사용자의 노트를 살펴 경우, 당신은 (인용)이 재귀 함수 제안 this note from tim, 확인할 수있는 것들 : 배열에 사용

function multimax($array) { 
    // use foreach to iterate over our input array. 
    foreach($array as $value) { 

     // check if $value is an array... 
     if(is_array($value)) { 

      // ... $value is an array so recursively pass it into multimax() to 
      // determine it's highest value. 
      $subvalue = multimax($value); 

      // if the returned $subvalue is greater than our current highest value, 
      // set it as our $return value. 
      if($subvalue > $return) { 
       $return = $subvalue; 
      } 

     } elseif($value > $return) { 
      // ... $value is not an array so set the return variable if it's greater 
      // than our highest value so far. 
      $return = $value; 
     } 
    } 

    // return (what should be) the highest value from any dimension. 
    return $return; 
} 

을 :

$arr= array(array(141,151,161),2,3,array(101,202,array(303,404))); 
$max = multimax($arr); 
var_dump($max); 

을 제공합니다 :

int 404 
,

물론 이것은 더 많은 테스트가 필요합니다.하지만 적어도 시작에 불과합니다.


(매뉴얼 페이지에 사용자의 노트를 통해가는 항상 좋은 생각이다 : 당신은 문제가 있다면, 기회는 다른 사람이 이미 그 문제 ;-)했다입니다)

+1

nit-picky :이 버전은 $ return이 초기화되지 않기 때문에 "정의되지 않은 변수"통지를 발생시킵니다.그리고'var_dump (multimax (array (0)));는 같은 이유로'int (0)'대신'NULL'을 출력합니다. – VolkerK

1

더 우아한 해결책에 대한 파스칼의 해결책으로 생각 만 짧은 감사 :

 
function MaxArray($arr) 
{ 
    function findMax($currentValue, $currentKey) 
    { 
     global $maxValue; 
     $maxValue = ($currentValue > $maxValue ? $currentValue : $maxValue); 
    } 
    array_walk_recursive($arr, 'findMax'); 
    return $GLOBALS['maxValue']; 
} 

0

너무 많은 재귀 피 최대 찾기 :

function array_max(array $array) { 
    $context = func_get_args(); 
    $max = -INF; 

    while (!empty($context)) { 
     $array = array_pop($context); 
     while (!empty($array)) { 
      $value = array_pop($array); 
      if (is_array($value)) { 
       array_push($context, $value); 
      } 
      elseif ($max < $value) { 
       $max = $value; 
      } 
     } 
    } 

    return $max; 
} 

너무 많은 재귀 피하고 좀 더 일반적인 방법 :이 방법에 의해

function array_reduce_recursive($default, array $array, $callback = null) { 
    $context = func_get_args(); 
    $count = func_num_args(); 
    if (is_callable(func_get_arg($count - 1))) { 
     $callback = array_pop($context); 
    } 
    else { 
     $callback = create_function('$x, $y', 'return $x < $y ? $y : $x;'); 
    } 
    $reduced = array_shift($context); 

    while (!empty($context)) { 
     $array = array_pop($context); 
     while (!empty($array)) { 
      $value = array_pop($array); 
      if (is_array($value)) { 
       array_push($context, $value); 
      } 
      else { 
       $reduced = $callback($reduced, $value); 
      } 
     } 
    } 

    return $reduced; 
} 

function array_max_recursive() { 
    $args = func_get_args(); 
    $callback = create_function('$x, $y', 'return $x < $y ? $y : $x;'); 
    return array_reduce_recursive(-INF, $args, $callback); 
} 

당신이 콜백 메소드의 경우를 지정할 수 있습니다 가장 큰 숫자가 아닌 다른 것을 찾고 있습니다. 또한이 메서드는 여러 배열을 사용합니다.

최종 방법의 효율성이 떨어집니다.

이 기능을 사용하면 많은 PHP 버전과 완벽하게 호환됩니다. 당신이 숙제처럼

2
$arr = array(array(141,151,161), 2, 3, array(101, 202, array(303,404))); 
$callback = function ($value, $key) use (&$maximo) { 
    if($value > $maximo){ 
     $maximo = $value; 
    } 
}; 
array_walk_recursive($arr, $callback); 
echo '<pre>'; print_r($maximo);`` 
+0

클로저를 사용하는 솔루션 –

0
function MaxArray($arr) { 
    $maximum = 0; 
    foreach ($arr as $value) { 
     if (is_array($value)) { 
      //print_r($value); 
      $tmaximum = MaxArray($value); 
      if($tmaximum > $maximum){ 
       $maximum = $tmaximum; 
      } 
     } 
     else 
     { 
      //echo $value.'\n'; 
      if($value > $maximum){ 
       $maximum = $value; 
      } 
     } 
    } 
    return $maximum; 
} 
1

그것은 매우 간단는

$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr)); 
$max = max(iterator_to_array($iterator, false)); 
관련 문제