2010-02-03 10 views
11

다차원 배열에서 특정 키의 최대 값을 선택하려고합니다. 나는 ... 문제의 핵심 "을 받고"문제가있어다차원 배열의 요소에서 최대 값 가져 오기?

그래서, 내가 노력하고있어

[0] => stdClass Object 
    (
     [id] => 70 
     [cust] => 4 
     [dnum] => 1 
     [upper] => Array 
      (
       [0] => 66 
      ) 

    ) 
[1] => stdClass Object 
    (
     [id] => 43 
     [cust] => 42 
     [dnum] => 2 
     [upper] => Array 
      (
       [0] => 77 
      ) 

    ) 
[2] => stdClass Object 
    (
     [id] => 12 
     [cust] => 3 
     [dnum] => 0 
     [upper] => Array 
      (
       [0] => 99 
      ) 

    ) 

을 (훨씬 더 긴 내가 여기에 게시하도록하겠습니다 것보다) 배열 전체 배열에서 최대 "dnum"값을 찾습니다. 따라서이 예제에서는 $ max = 2입니다. max 함수를 사용하면이 작업을 수행 할 수 있지만 전체를 넣지 않고 dnum 요소를 참조하는 방법을 모르겠습니다. foreach 루프에있는 것, 그리고 그렇게한다면 max는 사용할 함수가 아닙니다. 그렇죠?

그래서, 정확히이 작업을 수행 할 수 없습니다 전체 배열을 다시 할 필요없이이 작업을 수행하는 저를위한 방법은

$max = max($myarray[]->dnum); 

있습니까?

+0

@Felix 클링 : 왜 당신이 그런 __MINOR__ 편집을하고이 질문을 다시 활성화 할 것인가? –

+0

@Pranav : 정리 .... 태그는 제목에 속하지 않습니다. –

답변

10
$max = 0; 
foreach($array as $obj) 
{ 
    if($obj->dnum > $max) 
    { 
     $max = $obj->dnum; 
    } 
} 

가장 높은 숫자가 음수가 아닌 경우 그 기능이 제대로 작동 것 (네거티브, 빈 배열과 0은 0으로 최대를 반환합니다).

사용자 지정 속성/구조를 가질 수있는 개체를 사용하고 있기 때문에 실제로 사용할 수있는 '미리 정의 된'함수가 없다고 생각합니다. foreach 루프를 사용할 수도 있습니다.

내부 함수도 foreach 루프를 사용하기 때문에 실제로 foreach 루프에서 벗어날 수는 없습니다. 바로 뒤에서입니다.

다른 해결책은 PHP 5.2

$numbers = array(); 
foreach($array as $obj) 
{ 
    $numbers[] = $obj->dnum; 
} 
$max = max($numbers); 
21

는이 배열을 통해 루프 인 할 수있는 유일한 방법이다.

$max = null; 
foreach ($arr as $item) { 
    $max = $max === null ? $item->dnum : max($max, $item->dnum); 
} 

참고 : 모든 DNUM 값이 부의 경우, 지금 받아 솔루션은 잘못된 결과를 생성하기 때문에 나는이 0으로 결과를 파종했습니다. 맥스에게 현명한 뭔가를 뿌려야합니다.

또는 당신 array_reduce() 사용할 수 있습니다

$max = array_reduce($arr, 'max_dnum', -9999999); 

function max_denum($v, $w) { 
    return max($v, $w->dnum); 
} 
익명 기능을 사용할 수 있습니다 5.3+ PHP에서

가 :

$max = array_reduce($arr, function($v, $w) { 
    return max($v, $w->dnum); 
}, -9999999); 

당신은 너무 array_map()를 사용할 수 있습니다

function get_dnum($a) { 
    return $a->dnum; 
} 

$max = max(array_map('get_dnum', $arr)); 
+0

젠장, 대체 snytaxes의 사용! (농담) –

+0

+1'max()'를 사용하기 위해 : 나는 거의 모든 놀이 시간을 얻지 못한다. – Sampson

+1

다른 옵션을 가져 주셔서 감사합니다! 나는'array_map'이 인수를 다른 방법으로 사용한다고 믿는다. ([관련 문서] (http://php.net/manual/en/function.array-map.php)) 마지막 솔루션은'$ max = max (array_map ('get_dnum', $ arr)); ' – Robin

4

간단한 방법은 아마 초기 생각이다. 이것은 한 번 배열을 반복하는 것이다.

$out = array(); 
foreach($myarray as $obj) { 
    $out[] = $obj->dnum; 
} 
echo max($out); 

당신은 별도의 배열을 만들지 않고 그것을 할 수 있지만 훨씬 더 자주 max()를 호출하게 될 겁니다 : 다음 해당에 max() 전화, 별도의 배열로 모든 dnum 키를 잡아 당깁니다.성능/메모리 사용량, 둘 사이에 다를 수 있습니다 당신은 벤치 마크 항상 할 수 그것을 :

$first = $myarray[0]; //assume zero start index 
$max = $first->dnum; 
foreach($myarray as $obj) { 
    $max = max($max,$obj->dnum); 
} 
echo $max; 

당신이 usort()를 사용하여 배열을 정렬하는 것입니다 그것에 대해 갈 수있는 유일한 다른 방법과 개체를 기반으로 사용자 지정 정렬 기능 dnum 속성 그러나 배열을 반복하는 것보다 훨씬 느릴 수 있습니다. 따라서 배열을 부작용으로 분류하지 않은 이상 권장하지는 않습니다.

+0

와우, 펀치에 심한 타격. 시간 낭비없이 시간을 보내야합니다. : D – zombat

+0

+1 나는 감각을 알고 :) – Sampson

3

당신이 oneliners

을 좋아하는 경우에
$max = max(array_map(function($row){ return $row->dnum; }, $myarray));