From 4f89a87da2dcb8df84bb21138991fd45c954dcda Mon Sep 17 00:00:00 2001 From: Amirhf1 Date: Fri, 10 Jul 2026 03:36:31 +0330 Subject: [PATCH] Fix Collection::mode() merging distinct floats due to int-truncated array key --- src/Illuminate/Collections/Collection.php | 13 +++++++++++-- tests/Support/SupportCollectionTest.php | 7 +++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Collections/Collection.php b/src/Illuminate/Collections/Collection.php index 18de341e4bf4..696f4bc3798b 100644 --- a/src/Illuminate/Collections/Collection.php +++ b/src/Illuminate/Collections/Collection.php @@ -133,15 +133,24 @@ public function mode($key = null) $collection = isset($key) ? $this->pluck($key) : $this; $counts = $this->newInstance(); + $values = []; - $collection->each(fn ($value) => $counts[$value] = isset($counts[$value]) ? $counts[$value] + 1 : 1); + $collection->each(function ($value) use ($counts, &$values) { + $index = serialize($value); + + $counts[$index] = isset($counts[$index]) ? $counts[$index] + 1 : 1; + + $values[$index] = $value; + }); $sorted = $counts->sort(); $highestValue = $sorted->last(); return $sorted->filter(fn ($value) => $value == $highestValue) - ->sort()->keys()->all(); + ->keys() + ->map(fn ($index) => $values[$index]) + ->sort()->values()->all(); } /** diff --git a/tests/Support/SupportCollectionTest.php b/tests/Support/SupportCollectionTest.php index 258f0abcf5a7..67ffc0bcacc1 100755 --- a/tests/Support/SupportCollectionTest.php +++ b/tests/Support/SupportCollectionTest.php @@ -5133,6 +5133,13 @@ public function testWithMultipleModeValues($collection) $this->assertEquals([1, 2], $data->mode()); } + #[DataProvider('collectionClassProvider')] + public function testModeWithFloatValues($collection) + { + $data = new $collection([1.5, 1.5, 1.9, 2.9, 2.9, 2.9]); + $this->assertEquals([2.9], $data->mode()); + } + #[DataProvider('collectionClassProvider')] public function testSliceOffset($collection) {