diff --git a/src/Illuminate/Support/Collection.php b/src/Illuminate/Support/Collection.php index 429d46af3788..a6ebdbf1511c 100644 --- a/src/Illuminate/Support/Collection.php +++ b/src/Illuminate/Support/Collection.php @@ -726,20 +726,22 @@ public function forPage($page, $perPage) } /** - * Partition the collection into two array using the given callback. + * Partition the collection into two arrays using the given callback or key. * - * @param callable $callback - * @return array + * @param callable|string $callback + * @return static */ - public function partition(callable $callback) + public function partition($callback) { - $partitions = [new static(), new static()]; + $partitions = [new static, new static]; - foreach ($this->items as $item) { - $partitions[! (int) $callback($item)][] = $item; + $callback = $this->valueRetriever($callback); + + foreach ($this->items as $key => $item) { + $partitions[(int) ! $callback($item)][$key] = $item; } - return $partitions; + return new static($partitions); } /** diff --git a/tests/Support/SupportCollectionTest.php b/tests/Support/SupportCollectionTest.php index bdef348375d3..ab256a6b93d8 100755 --- a/tests/Support/SupportCollectionTest.php +++ b/tests/Support/SupportCollectionTest.php @@ -1640,7 +1640,7 @@ public function testSplitEmptyCollection() ); } - public function testPartition() + public function testPartitionWithClosure() { $collection = new Collection(range(1, 10)); @@ -1648,8 +1648,34 @@ public function testPartition() return $i <= 5; }); - $this->assertEquals([1, 2, 3, 4, 5], $firstPartition->toArray()); - $this->assertEquals([6, 7, 8, 9, 10], $secondPartition->toArray()); + $this->assertEquals([1, 2, 3, 4, 5], $firstPartition->values()->toArray()); + $this->assertEquals([6, 7, 8, 9, 10], $secondPartition->values()->toArray()); + } + + public function testPartitionByKey() + { + $courses = new Collection([ + ['free' => true, 'title' => 'Basic'], ['free' => false, 'title' => 'Premium'], + ]); + + list($free, $premium) = $courses->partition('free'); + + $this->assertSame([['free' => true, 'title' => 'Basic']], $free->values()->toArray()); + + $this->assertSame([['free' => false, 'title' => 'Premium']], $premium->values()->toArray()); + } + + public function testPartitionPreservesKeys() + { + $courses = new Collection([ + 'a' => ['free' => true], 'b' => ['free' => false], 'c' => ['free' => true], + ]); + + list($free, $premium) = $courses->partition('free'); + + $this->assertSame(['a' => ['free' => true], 'c' => ['free' => true]], $free->toArray()); + + $this->assertSame(['b' => ['free' => false]], $premium->toArray()); } public function testPartitionEmptyCollection()