diff --git a/model/GroupedList.php b/model/GroupedList.php new file mode 100644 index 000000000..390be964b --- /dev/null +++ b/model/GroupedList.php @@ -0,0 +1,50 @@ +list as $item) { + $key = is_object($item) ? $item->$index : $item[$index]; + + if (array_key_exists($key, $result)) { + $result[$key]->push($item); + } else { + $result[$key] = new ArrayList(array($item)); + } + } + + return $result; + } + + /** + * @param string $index + * @param string $children + * @return ArrayList + */ + public function GroupedBy($index, $children = 'Children') { + $grouped = $this->groupBy($index); + $result = new ArrayList(); + + foreach ($grouped as $indVal => $list) { + $result->push(new ArrayData(array( + $index => $indVal, + $children => $list + ))); + } + + return $result; + } + +} diff --git a/tests/model/GroupedListTest.php b/tests/model/GroupedListTest.php new file mode 100644 index 000000000..4307c67f3 --- /dev/null +++ b/tests/model/GroupedListTest.php @@ -0,0 +1,52 @@ + 'AAA'), + array('Name' => 'AAA'), + array('Name' => 'BBB'), + array('Name' => 'BBB'), + array('Name' => 'AAA'), + array('Name' => 'BBB'), + array('Name' => 'CCC'), + array('Name' => 'CCC') + ))); + + $grouped = $list->groupBy('Name'); + + $this->assertEquals(3, count($grouped)); + $this->assertEquals(3, count($grouped['AAA'])); + $this->assertEquals(3, count($grouped['BBB'])); + $this->assertEquals(2, count($grouped['CCC'])); + } + + public function testGroupedBy() { + $list = new GroupedList(new ArrayList(array( + array('Name' => 'AAA'), + array('Name' => 'AAA'), + array('Name' => 'BBB'), + array('Name' => 'BBB'), + array('Name' => 'AAA'), + array('Name' => 'BBB'), + array('Name' => 'CCC'), + array('Name' => 'CCC') + ))); + + $grouped = $list->GroupedBy('Name'); + $first = $grouped->first(); + $last = $grouped->last(); + + $this->assertEquals(3, count($first->Children)); + $this->assertEquals('AAA', $first->Name); + $this->assertEquals(2, count($last->Children)); + $this->assertEquals('CCC', $last->Name); + } + +}