2010-02-03 3 views
11

Tôi đang cố gắng chọn giá trị tối đa cho một khóa cụ thể trong một mảng đa chiều. Tôi đang gặp rắc rối "nhận được để" chìa khóa trong câu hỏi ...Nhận giá trị tối đa từ một phần tử trong một mảng đa chiều?

Vì vậy, các mảng (mà là nhiều hơn nữa kéo dài hơn những gì tôi gửi bài ở đây)

[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 
      ) 

    ) 

Tôi đang cố gắng để tìm giá trị tối đa "dnum" trên toàn bộ mảng, vì vậy trong ví dụ này, $ max = 2. Tôi biết rằng hàm tối đa cho phép tôi thực hiện điều này, nhưng tôi không chắc chắn cách tham khảo phần tử dnum mà không đặt toàn bộ điều trong một vòng lặp foreach, và nếu tôi làm điều đó, thì max sẽ không phải là chức năng để sử dụng, đúng không?

Vì vậy, tôi không thể chính xác làm điều này:

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

Có cách nào để tôi làm điều này mà không cần phải tái tạo lại toàn bộ mảng?

+0

@Felix Kling: TẠI SAO bạn sẽ thực hiện như một chỉnh sửa __MINOR__ và kích hoạt lại câu hỏi này? –

+0

@Pranav: Làm sạch .... thẻ không thuộc về tiêu đề. –

Trả lời

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

Chức năng này sẽ hoạt động chính xác nếu số cao nhất của bạn không âm (âm, mảng trống và 0 sẽ trả về giá trị lớn nhất là 0).

Vì bạn đang sử dụng một đối tượng có thể có các thuộc tính/cấu trúc tùy chỉnh, tôi không tin rằng có bất kỳ chức năng 'được xác định trước' nào bạn có thể sử dụng để lấy nó. Cũng có thể sử dụng vòng lặp foreach.

Bạn thực sự không thể thoát khỏi vòng lặp foreach, vì ngay cả chức năng nội bộ cũng sử dụng vòng lặp foreach, nó chỉ ở đằng sau hậu trường.

giải pháp khác là

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

Trong PHP 5.2 là cách duy nhất để làm điều này là để lặp qua mảng.

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

Lưu ý: tôi đã gieo mầm kết quả bằng 0 vì nếu tất cả các giá trị dnum là tiêu cực thì giải pháp hiện nay được chấp nhận sẽ tạo ra một kết quả không chính xác. Bạn cần hạt giống tối đa với một cái gì đó hợp lý.

Hoặc bạn có thể sử dụng array_reduce():

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

function max_denum($v, $w) { 
    return max($v, $w->dnum); 
} 

Trong PHP 5.3+ bạn có thể sử dụng một chức năng ẩn danh:

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

Bạn có thể sử dụng array_map() quá:

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

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

Đập bạn và việc bạn sử dụng các snytaxes thay thế! (đùa) –

+0

+1 Để sử dụng 'max()' :) Tôi hiếm khi thấy rằng nhận được bất kỳ thời gian chơi nào. – Sampson

+1

Cảm ơn các tùy chọn khác nhau! Tôi tin rằng 'array_map' lấy các đối số của nó theo cách khác ([doc có liên quan] (http://php.net/manual/en/function.array-map.php)) vì vậy giải pháp cuối cùng nên là' $ max = max (array_map ('get_dnum', $ arr)); ' – Robin

4

Cách đơn giản nhất cách có lẽ là suy nghĩ ban đầu của bạn, đó là để lặp mảng của bạn một lần , Và rút khỏi tất cả các phím dnum thành một mảng riêng biệt, sau đó gọi max() trên rằng:

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

Bạn có thể làm điều đó mà không cần tạo một mảng riêng biệt, nhưng bạn sẽ kết thúc gọi max() thường nhiều hơn nữa.sử dụng hiệu suất/bộ nhớ sẽ khác nhau giữa hai, bạn có thể luôn luôn benchmark nó:

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

Cách duy nhất khác mà bạn có thể đi về nó sẽ được sắp xếp mảng bằng cách sử dụng usort() và sắp xếp chức năng tùy chỉnh dựa trên đối tượng dnum thuộc tính. Điều này có lẽ sẽ chậm hơn nhiều so với việc lặp lại mảng của bạn, vì vậy tôi không nghĩ rằng tôi muốn giới thiệu nó trừ khi bạn cần mảng được sắp xếp như là một tác dụng phụ.

+0

Chà, đánh mạnh vào cú đấm. Tôi cần phải tốn ít thời gian hơn. : D – zombat

+0

+1 Tôi biết cảm giác :) – Sampson

3

Nếu bạn thích oneliners

$max = max(array_map(function($row){ return $row->dnum; }, $myarray));