Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Collection::transpose method #8957

Merged
merged 14 commits into from Jun 17, 2016
30 changes: 30 additions & 0 deletions src/Collection/CollectionInterface.php
Expand Up @@ -945,4 +945,34 @@ public function isEmpty();
* @return \Iterator
*/
public function unwrap();

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

double lines


/**
* Transpose rows and columns into columns and rows
*
* ### Example:
*
* ```
* $items = [
* ['Products', '2012', '2013', '2014'],
* ['Product A', '200', '100', '50'],
* ['Product B', '300', '200', '100'],
* ['Product C', '400', '300', '200'],
* ]
*
* $transpose = (new Collection($items))->transpose()->toList();
*
* // Returns
* // [
* // ['Products', 'Product A', 'Product B', 'Product C'],
* // ['2012', '200', '300', '400'],
* // ['2013', '100', '200', '300'],
* // ['2014', '50', '100', '200'],
* // ]
*
* ```
*
* @return Collection
*/
public function transpose();
}
21 changes: 20 additions & 1 deletion src/Collection/CollectionTrait.php
Expand Up @@ -576,7 +576,7 @@ public function unfold(callable $transformer = null)
public function through(callable $handler)
{
$result = $handler($this);
return $result instanceof CollectionInterface ? $result: new Collection($result);
return $result instanceof CollectionInterface ? $result : new Collection($result);
}

/**
Expand Down Expand Up @@ -658,4 +658,23 @@ public function _unwrap()
{
return $this->unwrap();
}

/**
* {@inheritDoc}
*
* @return \Cake\Collection
*/
public function transpose()
{
$arrayValue = $this->toList();
$length = count(current($arrayValue));
$result = [];
foreach ($arrayValue as $column => $row) {
if (count($row) != $length) {
throw new \LogicException('Child arrays do not have even length');
}
$result[] = array_column($arrayValue, $column);
}
return new Collection($result);
}
}
60 changes: 60 additions & 0 deletions tests/TestCase/Collection/Iterator/TransposeIteratorTest.php
@@ -0,0 +1,60 @@
<?php
/**
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @since 3.3.0
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you use the standard project file headers.


namespace Cake\Test\TestCase\Collection\Iterator;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There must be one blank line after the namespace declaration


use Cake\Collection\Collection;
use Cake\TestSuite\TestCase;

class TransposeIteratorTest extends TestCase
{

public function testTranspose()
{
$collection = new Collection([
['Products', '2012', '2013', '2014'],
['Product A', '200', '100', '50'],
['Product B', '300', '200', '100'],
['Product C', '400', '300', '200'],
]);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens when the arrays are of uneven lengths?

$transposed = $collection->transpose();
$expected = [
['Products', 'Product A', 'Product B', 'Product C'],
['2012', '200', '300', '400'],
['2013', '100', '200', '300'],
['2014', '50', '100', '200'],
];

$this->assertEquals($expected, $transposed->toList());
}

/**
* Tests that provided arrays do not have even length
*
* @expectedException \LogicException
* @return void
*/
public function testTransposeUnEvenLengthShouldThrowException()
{
$collection = new Collection([
['Products', '2012', '2013', '2014'],
['Product A', '200', '100', '50'],
['Product B', '300'],
['Product C', '400', '300'],
]);

$collection->transpose();
}
}