diff --git a/src/Illuminate/Collections/Collection.php b/src/Illuminate/Collections/Collection.php index 95faa17a7121..cccbf2e3efd8 100644 --- a/src/Illuminate/Collections/Collection.php +++ b/src/Illuminate/Collections/Collection.php @@ -516,9 +516,11 @@ public function groupBy($groupBy, $preserveKeys = false) foreach ($this->items as $key => $value) { $groupKeys = $groupBy($value, $key); - if (! is_array($groupKeys)) { - $groupKeys = [$groupKeys]; - } + $groupKeys = match (true) { + ! is_array($groupKeys) => [$groupKeys], + is_array($groupKeys) && empty($groupKeys) => [null], + default => $groupKeys, + }; foreach ($groupKeys as $groupKey) { $groupKey = match (true) { diff --git a/tests/Support/SupportCollectionTest.php b/tests/Support/SupportCollectionTest.php index 513e1fa4187a..19ab7e02338b 100755 --- a/tests/Support/SupportCollectionTest.php +++ b/tests/Support/SupportCollectionTest.php @@ -3457,6 +3457,32 @@ function ($item) { $this->assertEquals($expected_result, $result->toArray()); } + #[DataProvider('collectionClassProvider')] + public function testGroupWithEmptyValue($collection) + { + $data = new $collection([ + 10 => [], + 20 => ['user' => 2, 'roles' => []], + 30 => ['user' => 3, 'roles' => [null]], + 40 => ['user' => 4, 'roles' => ['Role_2']], + ]); + + $result = $data->groupBy('roles', true); + + $expected_result = [ + '' => [ + 10 => [], + 20 => ['user' => 2, 'roles' => []], + 30 => ['user' => 3, 'roles' => [null]], + ], + 'Role_2' => [ + 40 => ['user' => 4, 'roles' => ['Role_2']], + ], + ]; + + $this->assertEquals($expected_result, $result->toArray()); + } + #[DataProvider('collectionClassProvider')] public function testKeyByAttribute($collection) {