Skip to content

Commit

Permalink
Merge pull request #16644 from sileence/collection_partition_by_key
Browse files Browse the repository at this point in the history
[5.3] Allow collection partition by key and add preserving keys option
  • Loading branch information
taylorotwell committed Dec 6, 2016
2 parents 65115c4 + 6fb8796 commit 61e40c9
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 11 deletions.
18 changes: 10 additions & 8 deletions src/Illuminate/Support/Collection.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/**
Expand Down
32 changes: 29 additions & 3 deletions tests/Support/SupportCollectionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1640,16 +1640,42 @@ public function testSplitEmptyCollection()
);
}

public function testPartition()
public function testPartitionWithClosure()
{
$collection = new Collection(range(1, 10));

list($firstPartition, $secondPartition) = $collection->partition(function ($i) {
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()
Expand Down

0 comments on commit 61e40c9

Please sign in to comment.