]> granicus.if.org Git - php/commitdiff
Fixed bug #27782 (Wrong behaviour of next(), prev() and each()).
authorIlia Alshanetsky <iliaa@php.net>
Tue, 30 Mar 2004 19:08:43 +0000 (19:08 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Tue, 30 Mar 2004 19:08:43 +0000 (19:08 +0000)
Zend/zend_builtin_functions.c
ext/standard/array.c
ext/standard/tests/array/bug27782.phpt [new file with mode: 0644]

index 42a82754dcc120cbebed54a08d07ff306bf85779..d15e6fb55a61b2153ebb51c51bc60202296c8bcd 100644 (file)
@@ -368,6 +368,9 @@ ZEND_FUNCTION(each)
                return;
        }
        if (zend_hash_get_current_data(target_hash, (void **) &entry_ptr)==FAILURE) {
+               if (!target_hash->pInternalPointer) {
+                       zend_hash_internal_pointer_end(target_hash);
+               }
                RETURN_FALSE;
        }
        array_init(return_value);
index 539848322e5990ae3918e4127d6370b3085939a5..831357e5330ab30895095159a62d55107c7d452e 100644 (file)
@@ -740,6 +740,10 @@ PHP_FUNCTION(prev)
                RETURN_FALSE;
        }
        zend_hash_move_backwards(target_hash);
+       if (!target_hash->pInternalPointer) {
+               zend_hash_internal_pointer_reset(target_hash);
+               RETURN_FALSE;
+       }
 
        if (return_value_used) {        
                if (zend_hash_get_current_data(target_hash, (void **) &entry) == FAILURE) {
@@ -768,6 +772,10 @@ PHP_FUNCTION(next)
                RETURN_FALSE;
        }
        zend_hash_move_forward(target_hash);
+       if (!target_hash->pInternalPointer) {
+               zend_hash_internal_pointer_end(target_hash);
+               RETURN_FALSE;
+       }
 
        if (return_value_used) {
                if (zend_hash_get_current_data(target_hash, (void **) &entry) == FAILURE) {
diff --git a/ext/standard/tests/array/bug27782.phpt b/ext/standard/tests/array/bug27782.phpt
new file mode 100644 (file)
index 0000000..2c8c675
--- /dev/null
@@ -0,0 +1,32 @@
+--TEST--
+Bug #27782 (each(), next(), prev() mange array position)
+--FILE--
+<?php
+$a = array("a", "b", "c");
+reset($a);
+
+while (next($a) !== false);
+
+echo current($a) . "\n";
+echo prev($a) . "\n";
+
+reset($a);
+
+while (list(,$foo) = each($a)) {
+       echo $foo . "\n";
+}
+echo current($a) . "\n";
+
+while ($foo = prev($a)) {
+       echo $foo . "\n";
+}
+?>
+--EXPECT--
+c
+b
+a
+b
+c
+c
+b
+a