]> granicus.if.org Git - php/commitdiff
Fixed bug #54971 (Wrong result when using iterator_to_array with use_keys on true)
authorPierrick Charron <pierrick@php.net>
Tue, 28 Jun 2011 11:09:06 +0000 (11:09 +0000)
committerPierrick Charron <pierrick@php.net>
Tue, 28 Jun 2011 11:09:06 +0000 (11:09 +0000)
NEWS
ext/spl/spl_iterators.c
ext/spl/tests/bug54971.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 16f0a10046194d1c7f3cc55427b93547a621a5cf..78f2582bbbd3d7e383a7e9200fe2a96d9195f92f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,9 @@ PHP                                                                        NEWS
 - PDO ODBC driver:
   . Fixed data type usage in 64bit. (leocsilva at gmail dot com)
 
+- SPL extension:
+  . Fixed bug #54971 (Wrong result when using iterator_to_array with use_keys
+    on true). (Pierrick)
 
 16 Jun 2011, PHP 5.3.7 RC1
 - Upgraded bundled SQLite to version 3.7.6.3. (Scott)
index 944997c731b9163e3495129b0fa3ef4cd45dd51d..1b911b591d0e8f0bbf750f054babf91b3721218a 100755 (executable)
@@ -3306,6 +3306,7 @@ PHPAPI int spl_iterator_apply(zval *obj, spl_iterator_apply_func_t apply_func, v
                goto done;
        }
 
+       iter->index = 0;
        if (iter->funcs->rewind) {
                iter->funcs->rewind(iter TSRMLS_CC);
                if (EG(exception)) {
@@ -3320,6 +3321,7 @@ PHPAPI int spl_iterator_apply(zval *obj, spl_iterator_apply_func_t apply_func, v
                if (apply_func(iter, puser TSRMLS_CC) == ZEND_HASH_APPLY_STOP || EG(exception)) {
                        goto done;
                }
+               iter->index++;
                iter->funcs->move_forward(iter TSRMLS_CC);
                if (EG(exception)) {
                        goto done;
diff --git a/ext/spl/tests/bug54971.phpt b/ext/spl/tests/bug54971.phpt
new file mode 100644 (file)
index 0000000..166613b
--- /dev/null
@@ -0,0 +1,45 @@
+--TEST--
+Bug #54971 (Wrong result when using iterator_to_array with use_keys on true)
+--FILE--
+<?php
+
+$source = <<<XML
+<root>
+<node>val1</node>
+<node>val2</node>
+</root>
+XML;
+
+
+$doc = new DOMDocument();
+$doc->loadXML($source);
+
+$xpath = new DOMXPath($doc);
+$items = $xpath->query('//node');
+
+print_r(iterator_to_array($items, false));
+print_r(iterator_to_array($items, true));
+?>
+--EXPECT--
+Array
+(
+    [0] => DOMElement Object
+        (
+        )
+
+    [1] => DOMElement Object
+        (
+        )
+
+)
+Array
+(
+    [0] => DOMElement Object
+        (
+        )
+
+    [1] => DOMElement Object
+        (
+        )
+
+)