Fixed bug #9779: t3lib_div::trimExplode limit parameter leads to wrong result with...
authorIngo Renner <ingo.renner@typo3.org>
Tue, 3 Mar 2009 19:04:08 +0000 (19:04 +0000)
committerIngo Renner <ingo.renner@typo3.org>
Tue, 3 Mar 2009 19:04:08 +0000 (19:04 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@5115 709f56b5-9817-0410-a4d7-c38de5d9e867

ChangeLog
t3lib/class.t3lib_div.php
tests/t3lib/t3lib_div_testcase.php

index aa9313c..8067b43 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2009-03-03  Ingo Renner  <ingo@typo3.org>
+
+       * Fixed bug #9779: t3lib_div::trimExplode limit parameter leads to wrong result with non-empty requirement
+
 2009-03-03  Michael Stucki  <michael@typo3.org>
 
        * TEMPORARY (remove when solved): Disable output of deprecation messages until error handling is implemented.
 2009-03-03  Michael Stucki  <michael@typo3.org>
 
        * TEMPORARY (remove when solved): Disable output of deprecation messages until error handling is implemented.
index f647385..565a1db 100755 (executable)
@@ -1648,13 +1648,16 @@ final class t3lib_div {
         * @param       string          Delimiter string to explode with
         * @param       string          The string to explode
         * @param       boolean         If set, all empty values will be removed in output
         * @param       string          Delimiter string to explode with
         * @param       string          The string to explode
         * @param       boolean         If set, all empty values will be removed in output
-        * @param       integer         If positive, the result will contain a maximum of $limit elements,
-        *                                              if negative, all components except the last -$limit are returned,
-        *                                              if zero (default), the result is not limited at all
+        * @param       integer         If positive, the result will contain a maximum of
+        *                                              $limit elements, if negative, all components except
+        *                                              the last -$limit are returned, if zero (default),
+        *                                              the result is not limited at all. Attention though
+        *                                              that the use of this parameter can slow down this
+        *                                              function.
         * @return      array           Exploded values
         */
        public static function trimExplode($delim, $string, $removeEmptyValues = false, $limit = 0) {
         * @return      array           Exploded values
         */
        public static function trimExplode($delim, $string, $removeEmptyValues = false, $limit = 0) {
-               $explodedValues = $limit ? explode($delim, $string, $limit) : explode($delim, $string);
+               $explodedValues = explode($delim, $string);
 
                $result = array_map('trim', $explodedValues);
 
 
                $result = array_map('trim', $explodedValues);
 
@@ -1668,6 +1671,10 @@ final class t3lib_div {
                        $result = $temp;
                }
 
                        $result = $temp;
                }
 
+               if ($limit != 0) {
+                       $result = array_slice($result, 0, $limit);
+               }
+
                return $result;
        }
 
                return $result;
        }
 
index 6568458..74dc675 100644 (file)
@@ -68,9 +68,9 @@ class t3lib_div_testcase extends tx_phpunit_testcase {
        /**
         * @test
         */
        /**
         * @test
         */
-       public function checkTrimExplodeLimitsResults() {
+       public function checkTrimExplodeLimitsResultsToFirstXElementsWithPositiveParameter() {
                $testString = ' a , b , c , , d,, ,e ';
                $testString = ' a , b , c , , d,, ,e ';
-               $expectedArray = array('a', 'b', 'c , , d,, ,e'); // limiting returns the rest of the string as the last element
+               $expectedArray = array('a', 'b', 'c'); // limiting returns the rest of the string as the last element
                $actualArray = t3lib_div::trimExplode(',', $testString, false, 3);
 
                $this->assertEquals($expectedArray, $actualArray);
                $actualArray = t3lib_div::trimExplode(',', $testString, false, 3);
 
                $this->assertEquals($expectedArray, $actualArray);
@@ -79,6 +79,17 @@ class t3lib_div_testcase extends tx_phpunit_testcase {
        /**
         * @test
         */
        /**
         * @test
         */
+       public function checkTrimExplodeLimitsResultsToLastXElementsWithNegativeParameter() {
+               $testString = ' a , b , c , d, ,e, f , , ';
+               $expectedArray = array('a', 'b', 'c'); // limiting returns the rest of the string as the last element
+               $actualArray = t3lib_div::trimExplode(',', $testString, true, -3);
+
+               $this->assertEquals($expectedArray, $actualArray);
+       }
+
+       /**
+        * @test
+        */
        public function checkTrimExplodeKeepsZeroAsString() {
                $testString = 'a , b , c , ,d ,, ,e,f, 0 ,';
                $expectedArray = array('a', 'b', 'c', 'd', 'e', 'f', '0');
        public function checkTrimExplodeKeepsZeroAsString() {
                $testString = 'a , b , c , ,d ,, ,e,f, 0 ,';
                $expectedArray = array('a', 'b', 'c', 'd', 'e', 'f', '0');