Browse Source

Merge pull request #7153 from antograssiot/issue-7095

allow Dates to be numerically sorted by SortIterator
José Lorenzo Rodríguez 10 years ago
parent
commit
f2bd73dbb3

+ 6 - 2
src/Collection/Iterator/SortIterator.php

@@ -46,7 +46,7 @@ class SortIterator extends Collection
      *
      * The callback will receive as first argument each of the elements in $items,
      * the value returned in the callback will be used as the value for sorting such
-     * element. Please not that the callback function could be called more than once
+     * element. Please note that the callback function could be called more than once
      * per element.
      *
      * @param array|\Traversable $items The values to sort
@@ -67,7 +67,11 @@ class SortIterator extends Collection
         $callback = $this->_propertyExtractor($callback);
         $results = [];
         foreach ($items as $key => $value) {
-            $results[$key] = $callback($value);
+            $value = $callback($value);
+            if ($value instanceof \DateTime && $type === SORT_NUMERIC) {
+                $value = $value->format('U');
+            }
+            $results[$key] = $value;
         }
 
         $dir === SORT_DESC ? arsort($results, $type) : asort($results, $type);

+ 42 - 0
tests/TestCase/Collection/Iterator/SortIteratorTest.php

@@ -16,6 +16,7 @@ namespace Cake\Test\TestCase\Collection\Iterator;
 
 use ArrayObject;
 use Cake\Collection\Iterator\SortIterator;
+use Cake\I18n\Time;
 use Cake\TestSuite\TestCase;
 
 /**
@@ -191,4 +192,45 @@ class SortIteratorTest extends TestCase
         ];
         $this->assertEquals($expected, $sorted->toList());
     }
+
+    /**
+     * Tests sorting datetime
+     *
+     * @return void
+     */
+    public function testSortDateTime()
+    {
+        $items = new ArrayObject([
+            new \DateTime('2014-07-21'),
+            new \DateTime('2015-06-30'),
+            new \DateTime('2013-08-12')
+        ]);
+        $a = new \DateTime();
+
+        $callback = function ($a) {
+            return $a->add(new \DateInterval('P1Y'));
+        };
+        $sorted = new SortIterator($items, $callback);
+        $expected = [
+            new \DateTime('2016-06-30'),
+            new \DateTime('2015-07-21'),
+            new \DateTime('2014-08-12')
+
+        ];
+        $this->assertEquals($expected, $sorted->toList());
+
+        $items = new ArrayObject([
+            new \DateTime('2014-07-21'),
+            new \DateTime('2015-06-30'),
+            new \DateTime('2013-08-12')
+        ]);
+
+        $sorted = new SortIterator($items, $callback, SORT_ASC);
+        $expected = [
+            new \DateTime('2014-08-12'),
+            new \DateTime('2015-07-21'),
+            new \DateTime('2016-06-30'),
+        ];
+        $this->assertEquals($expected, $sorted->toList());
+    }
 }