如何在对象数组中找到max属性?

Pet*_*rne 7 php arrays object

如何找到数组中对象的最大值?

假设我有一个像这样的对象数组:

$data_points = [$point1, $point2, $point3];
Run Code Online (Sandbox Code Playgroud)

哪里

$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';
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情:

$max = max_attribute_in_array($data_points, 'value');
Run Code Online (Sandbox Code Playgroud)

我知道我可以foreach使用内置函数迭代数组但是有更优雅的方法吗?

Abr*_*ver 12

所有示例都假设这$prop是对象属性的名称,如value示例所示:

function max_attribute_in_array($array, $prop) {
    return max(array_map(function($o) use($prop) {
                            return $o->$prop;
                         },
                         $array));
}
Run Code Online (Sandbox Code Playgroud)
  • 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');
Run Code Online (Sandbox Code Playgroud)

如果使用PHP> = 7然后array_column处理对象:

function max_attribute_in_array($array, $prop) {
    return max(array_column($array, $prop));
}
Run Code Online (Sandbox Code Playgroud)

这是马克·贝克array_reduce从评论:

$result = array_reduce(function($carry, $o) use($prop) {
                           $carry = max($carry, $o->$prop);
                           return $carry;
                       }, $array, -PHP_INT_MAX);
Run Code Online (Sandbox Code Playgroud)

  • 类似于:`array_reduce( function($carry, $o) { $carry = max($carry, $o->$prop); return $carry; } $array, -PHP_INT_MAX );` (2认同)