diff --git a/src/Illuminate/Support/Collection.php b/src/Illuminate/Support/Collection.php index d89737e62d22..387b35b453e4 100644 --- a/src/Illuminate/Support/Collection.php +++ b/src/Illuminate/Support/Collection.php @@ -122,8 +122,16 @@ public function all() */ public function avg($callback = null) { - if ($count = $this->count()) { - return $this->sum($callback) / $count; + $callback = $this->valueRetriever($callback); + + $items = $this->map(function ($value) use ($callback) { + return $callback($value); + })->filter(function ($value) { + return ! is_null($value); + }); + + if ($count = $items->count()) { + return $items->sum() / $count; } } diff --git a/tests/Support/SupportCollectionTest.php b/tests/Support/SupportCollectionTest.php index 3601dca9c062..e503a3de0be7 100755 --- a/tests/Support/SupportCollectionTest.php +++ b/tests/Support/SupportCollectionTest.php @@ -2098,6 +2098,13 @@ public function testGettingAvgItemsFromCollection() $this->assertEquals(15, $c->avg('foo')); $this->assertEquals(15, $c->avg->foo); + $c = new Collection([(object) ['foo' => 10], (object) ['foo' => 20], (object) ['foo' => null]]); + $this->assertEquals(15, $c->avg(function ($item) { + return $item->foo; + })); + $this->assertEquals(15, $c->avg('foo')); + $this->assertEquals(15, $c->avg->foo); + $c = new Collection([['foo' => 10], ['foo' => 20]]); $this->assertEquals(15, $c->avg('foo')); $this->assertEquals(15, $c->avg->foo);