2016-04-13 3 views
1

Как найти максимальное значение для объектов в моем массиве?Как найти атрибут max в массиве объектов?

Скажем, у меня есть массив объектов, как это:

$data_points = [$point1, $point2, $point3]; 

где

$point1 = new stdClass; 
$point1->value = 0.2; 
$point1->name = 'Bob'; 

$point2 = new stdClass; 
$point2->value = 1.2; 
$point2->name = 'Dave'; 

$point3 = new stdClass; 
$point3->value = 0.8; 
$point3->name = 'Steve'; 

Я хотел бы сделать что-то вроде этого:

$max = max_attribute_in_array($data_points, 'value'); 

Я знаю, что могу итерации по массиву с foreach, но есть ли более элегантный метод usin g встроенных функций?

ответ

2

Вот функция:

function max_attribute_in_array($array, $prop) { 
    return max(array_map(function($o) use($prop) { 
          return $o->$prop; 
         }, 
         $array)); 
} 
  • array_map() принимает каждый элемент массива и возвращает свойство объекта в новый массив
  • Тогда просто возвращает результат max() на этом массиве

И для удовольствия, здесь вы можете перейти в max или min или что-то, что работает с массивом в качестве третьего параметра:

function calc_attribute_in_array($array, $prop, $func) { 
    $result = array_map(function($o) use($prop) { 
          return $o->$prop; 
         }, 
         $array); 

    if(function_exists($func)) { 
     return $func($result); 
    } 
    return false; 
} 

$max = calc_attribute_in_array($data_points, 'value', 'max'); 
$min = calc_attribute_in_array($data_points, 'value', 'min'); 

При использовании PHP 7 затем array_column() работы по объектам:

function max_attribute_in_array($array, $prop) { 
    return max(array_column($array, $prop)); 
} 
+1

Или прохладное 'array_reduce()' также может быть интересно –

+0

@MarkBa ker: Пойдите для этого :-) – AbraCadaver

+0

Пропустите его через модульные тесты и работайте как сон, спасибо –

2

попробовать это:

$point1 = new stdClass; 
$point1->value = 0.2; 
$point1->name = 'Bob'; 

$point2 = new stdClass; 
$point2->value = 1.2; 
$point2->name = 'Dave'; 

$point3 = new stdClass; 
$point3->value = 0.8; 
$point3->name = 'Steve'; 

$data_points = [$point1, $point2, $point3]; 

function max_attribute_in_array($data_points, $value='value'){ 
    $max=0; 
    foreach($data_points as $point){ 
     if($max < (float)$point->{$value}){ 
      $max = $point->{$value}; 
     } 
    } 
    return $max; 
} 
$max = max_attribute_in_array($data_points); 
var_dump($max); 

ответ:

float 1.2 
Смежные вопросы