Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Move combine() across.

  • Loading branch information...
commit e4a505797ddd54105631ad570c59447c7e6862bb 1 parent aa4dca6
@markstory markstory authored
Showing with 269 additions and 3 deletions.
  1. +204 −0 lib/Cake/Test/Case/Utility/Set2Test.php
  2. +65 −3 lib/Cake/Utility/Set2.php
View
204 lib/Cake/Test/Case/Utility/Set2Test.php
@@ -116,6 +116,41 @@ public static function articleData() {
);
}
+ public static function userData() {
+ return array(
+ array(
+ 'User' => array(
+ 'id' => 2,
+ 'group_id' => 1,
+ 'Data' => array(
+ 'user' => 'mariano.iglesias',
+ 'name' => 'Mariano Iglesias'
+ )
+ )
+ ),
+ array(
+ 'User' => array(
+ 'id' => 14,
+ 'group_id' => 2,
+ 'Data' => array(
+ 'user' => 'phpnut',
+ 'name' => 'Larry E. Masters'
+ )
+ )
+ ),
+ array(
+ 'User' => array(
+ 'id' => 25,
+ 'group_id' => 1,
+ 'Data' => array(
+ 'user' => 'gwoo',
+ 'name' => 'The Gwoo'
+ )
+ )
+ )
+ );
+ }
+
/**
* Test get()
*
@@ -1074,4 +1109,173 @@ public function testCheck() {
$this->assertTrue(Set2::check($set, 'My Index 1.First.Second.Third.Fourth'));
$this->assertFalse(Set2::check($set, 'My Index 1.First.Seconds.Third.Fourth'));
}
+
+/**
+ * testCombine method
+ *
+ * @return void
+ */
+ public function testCombine() {
+ $result = Set2::combine(array(), '{n}.User.id', '{n}.User.Data');
+ $this->assertTrue(empty($result));
+
+ $a = self::userData();
+
+ $result = Set2::combine($a, '{n}.User.id');
+ $expected = array(2 => null, 14 => null, 25 => null);
+ $this->assertEquals($expected, $result);
+
+ $result = Set2::combine($a, '{n}.User.id', '{n}.User.non-existant');
+ $expected = array(2 => null, 14 => null, 25 => null);
+ $this->assertEquals($expected, $result);
+
+ $result = Set2::combine($a, '{n}.User.id', '{n}.User.Data');
+ $expected = array(
+ 2 => array('user' => 'mariano.iglesias', 'name' => 'Mariano Iglesias'),
+ 14 => array('user' => 'phpnut', 'name' => 'Larry E. Masters'),
+ 25 => array('user' => 'gwoo', 'name' => 'The Gwoo'));
+ $this->assertEquals($expected, $result);
+
+ $result = Set2::combine($a, '{n}.User.id', '{n}.User.Data.name');
+ $expected = array(
+ 2 => 'Mariano Iglesias',
+ 14 => 'Larry E. Masters',
+ 25 => 'The Gwoo');
+ $this->assertEquals($expected, $result);
+ }
+
+/**
+ * test combine() with a group path.
+ *
+ * @return void
+ */
+ public function testCombineWithGroupPath() {
+ $a = self::userData();
+
+ $result = Set2::combine($a, '{n}.User.id', '{n}.User.Data', '{n}.User.group_id');
+ $expected = array(
+ 1 => array(
+ 2 => array('user' => 'mariano.iglesias', 'name' => 'Mariano Iglesias'),
+ 25 => array('user' => 'gwoo', 'name' => 'The Gwoo')
+ ),
+ 2 => array(
+ 14 => array('user' => 'phpnut', 'name' => 'Larry E. Masters')
+ )
+ );
+ $this->assertEquals($expected, $result);
+
+ $result = Set2::combine($a, '{n}.User.id', '{n}.User.Data.name', '{n}.User.group_id');
+ $expected = array(
+ 1 => array(
+ 2 => 'Mariano Iglesias',
+ 25 => 'The Gwoo'
+ ),
+ 2 => array(
+ 14 => 'Larry E. Masters'
+ )
+ );
+ $this->assertEquals($expected, $result);
+
+
+ $result = Set2::combine($a, '{n}.User.id', '{n}.User.Data', '{n}.User.group_id');
+ $expected = array(
+ 1 => array(
+ 2 => array('user' => 'mariano.iglesias', 'name' => 'Mariano Iglesias'),
+ 25 => array('user' => 'gwoo', 'name' => 'The Gwoo')
+ ),
+ 2 => array(
+ 14 => array('user' => 'phpnut', 'name' => 'Larry E. Masters')
+ )
+ );
+ $this->assertEquals($expected, $result);
+
+ $result = Set2::combine($a, '{n}.User.id', '{n}.User.Data.name', '{n}.User.group_id');
+ $expected = array(
+ 1 => array(
+ 2 => 'Mariano Iglesias',
+ 25 => 'The Gwoo'
+ ),
+ 2 => array(
+ 14 => 'Larry E. Masters'
+ )
+ );
+ $this->assertEquals($expected, $result);
+ }
+
+/**
+ * Test combine with formatting rules.
+ *
+ * @return void
+ */
+ public function testCombineWithFormatting() {
+ $this->markTestIncomplete('Not done, format() is not implemented');
+ $a = self::userData();
+
+ $result = Set2::combine(
+ $a,
+ '{n}.User.id',
+ array('{0}: {1}', '{n}.User.Data.user', '{n}.User.Data.name'),
+ '{n}.User.group_id'
+ );
+ $expected = array(
+ 1 => array(
+ 2 => 'mariano.iglesias: Mariano Iglesias',
+ 25 => 'gwoo: The Gwoo'
+ ),
+ 2 => array(
+ 14 => 'phpnut: Larry E. Masters'
+ )
+ );
+ $this->assertEquals($expected, $result);
+
+ $result = Set2::combine(
+ $a,
+ array('{0}: {1}',
+ '{n}.User.Data.user',
+ '{n}.User.Data.name'),
+ '{n}.User.id'
+ );
+ $expected = array(
+ 'mariano.iglesias: Mariano Iglesias' => 2,
+ 'phpnut: Larry E. Masters' => 14,
+ 'gwoo: The Gwoo' => 25
+ );
+ $this->assertEquals($expected, $result);
+
+ $result = Set2::combine(
+ $a,
+ array('{1}: {0}', '{n}.User.Data.user', '{n}.User.Data.name'),
+ '{n}.User.id'
+ );
+ $expected = array(
+ 'Mariano Iglesias: mariano.iglesias' => 2,
+ 'Larry E. Masters: phpnut' => 14,
+ 'The Gwoo: gwoo' => 25
+ );
+ $this->assertEquals($expected, $result);
+
+ $result = Set2::combine(
+ $a,
+ array('%1$s: %2$d', '{n}.User.Data.user', '{n}.User.id'),
+ '{n}.User.Data.name'
+ );
+ $expected = array(
+ 'mariano.iglesias: 2' => 'Mariano Iglesias',
+ 'phpnut: 14' => 'Larry E. Masters',
+ 'gwoo: 25' => 'The Gwoo'
+ );
+ $this->assertEquals($expected, $result);
+
+ $result = Set2::combine(
+ $a,
+ array('%2$d: %1$s', '{n}.User.Data.user', '{n}.User.id'),
+ '{n}.User.Data.name'
+ );
+ $expected = array(
+ '2: mariano.iglesias' => 'Mariano Iglesias',
+ '14: phpnut' => 'Larry E. Masters',
+ '25: gwoo' => 'The Gwoo'
+ );
+ $this->assertEquals($expected, $result);
+ }
}
View
68 lib/Cake/Utility/Set2.php
@@ -308,7 +308,69 @@ public static function remove(array $data, $path) {
return $data;
}
- public static function combine(array $data, $keyPath, $valuePath = null) {
+
+/**
+ * Creates an associative array using `$keyPath` as the path to build its keys, and optionally
+ * `$valuePath` as path to get the values. If `$valuePath` is not specified, all values will be initialized
+ * to null (useful for Set::merge). You can optionally group the values by what is obtained when
+ * following the path specified in `$groupPath`.
+ *
+ * @param array $data Array from where to extract keys and values
+ * @param string $keyPath A dot-separated string.
+ * @param string $valuePath A dot-separated string.
+ * @param string $groupPath A dot-separated string.
+ * @return array Combined array
+ * @link http://book.cakephp.org/2.0/en/core-utility-libraries/set.html#Set::combine
+ */
+ public static function combine(array $data, $keyPath, $valuePath = null, $groupPath = null) {
+ if (empty($data)) {
+ return array();
+ }
+
+ if (is_array($keyPath)) {
+ $format = array_shift($keyPath);
+ $keys = self::format($data, $format, $keyPath);
+ } else {
+ $keys = self::extract($data, $keyPath);
+ }
+ if (empty($keys)) {
+ return array();
+ }
+
+ if (!empty($valuePath) && is_array($valuePath)) {
+ $format = array_shift($valuePath);
+ $vals = self::format($data, $format, $valuePath);
+ } elseif (!empty($valuePath)) {
+ $vals = self::extract($data, $valuePath);
+ }
+
+ $count = count($keys);
+ for ($i = 0; $i < $count; $i++) {
+ if (!isset($vals[$i])) {
+ $vals[$i] = null;
+ }
+ }
+
+ if ($groupPath != null) {
+ $group = self::extract($data, $groupPath);
+ if (!empty($group)) {
+ $c = count($keys);
+ for ($i = 0; $i < $c; $i++) {
+ if (!isset($group[$i])) {
+ $group[$i] = 0;
+ }
+ if (!isset($out[$group[$i]])) {
+ $out[$group[$i]] = array();
+ }
+ $out[$group[$i]][$keys[$i]] = $vals[$i];
+ }
+ return $out;
+ }
+ }
+ if (empty($vals)) {
+ return array();
+ }
+ return array_combine($keys, $vals);
}
@@ -380,10 +442,10 @@ public static function check(array $data, $path) {
public static function filter(array $data) {
foreach ($data as $k => $v) {
if (is_array($v)) {
- $data[$k] = Set2::filter($v);
+ $data[$k] = self::filter($v);
}
}
- return array_filter($data, array('Set2', '_filter'));
+ return array_filter($data, array('self', '_filter'));
}
/**
Please sign in to comment.
Something went wrong with that request. Please try again.