<?php
// test data
class Foo {
private $a;
private $b;
function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
public function getA() { return $this->a; }
public function getB() { return $this->b; }
}
$list = [
$foo1 = new Foo(2, "bar"),
$foo2 = new Foo(5, "baz"),
$foo3 = new Foo(1, "bam"),
];
// simple
$isGreater = function($carry, $item) {
return is_null($carry) || $item->getA() > $carry->getA() ? $item : $carry;
};
$maxOfList = array_reduce($list, $isGreater);
assert($maxOfList === $foo2);
// reusable max() function
$max = function($list, callable $extract) {
$compare = function($carry, $item) use($extract) {
return is_null($carry) || $extract($item) > $extract($carry) ? $item : $carry;
};
return array_reduce($list, $compare);
};
$extractA = function($x) { return $x->getA();};
assert($max($list, $extractA) === $foo2);
preferences:
46.8 ms | 402 KiB | 5 Q