fix bug related to #865
authorMárcio Almada <marcio3w@gmail.com>
Mon, 19 Sep 2016 16:42:07 +0000 (12:42 -0400)
committerNikita Popov <nikic@php.net>
Thu, 22 Sep 2016 10:46:19 +0000 (12:46 +0200)
In case USE_KEY flag is active, RegexIterator->accept() should keep it's
old behavior which is to accept keys mapping arrays.

This broke after PHP 5.5 but was not noticed due to lack of tests for USE_KEY.

ext/spl/spl_iterators.c
ext/spl/tests/bug68128-USE_KEY.phpt [new file with mode: 0644]
ext/spl/tests/iterator_053.phpt

index a023b11829e12938cc10efb86096f3b3c94eba63..878e5a10f0138f36a7cd014094ee790d4cd8353e 100644 (file)
@@ -2053,13 +2053,14 @@ SPL_METHOD(RegexIterator, accept)
        
        if (intern->current.data == NULL) {
                RETURN_FALSE;
-       } else if (Z_TYPE_P(intern->current.data) == IS_ARRAY) {
-               RETURN_FALSE;
        }
 
        if (intern->u.regex.flags & REGIT_USE_KEY) {
                subject_ptr = intern->current.key;
        } else {
+               if (Z_TYPE_P(intern->current.data) == IS_ARRAY) {
+                       RETURN_FALSE;
+               }
                subject_ptr = intern->current.data;
        }
 
diff --git a/ext/spl/tests/bug68128-USE_KEY.phpt b/ext/spl/tests/bug68128-USE_KEY.phpt
new file mode 100644 (file)
index 0000000..f5fcdae
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+Bug #68128 - RecursiveRegexIterator raises "Array to string conversion" notice
+--FILE--
+<?php
+
+$arrayIterator = new ArrayIterator(array('key 1' => 'value 1', 'key 2' => ['value 2']));
+$regexIterator = new RegexIterator($arrayIterator, '/^key/', RegexIterator::MATCH, RegexIterator::USE_KEY);
+
+foreach ($regexIterator as $key => $value) {
+    var_dump($key, $value);
+}
+
+?>
+--EXPECT--
+string(5) "key 1"
+string(7) "value 1"
+string(5) "key 2"
+array(1) {
+  [0]=>
+  string(7) "value 2"
+}
index b472523ab6607cfe14bce659344b56a44368d597..21c044c1b2d7026a57e27805668a8b1cbde7725e 100644 (file)
@@ -50,7 +50,7 @@ bool(true)
 bool(true)
 bool(true)
 bool(true)
-bool(false)
+bool(true)
 bool(true)
 bool(true)
 bool(true)
@@ -124,7 +124,20 @@ array(2) {
     string(1) "4"
   }
 }
-bool(false)
+bool(true)
+int(5)
+array(2) {
+  [0]=>
+  array(1) {
+    [0]=>
+    string(1) "5"
+  }
+  [1]=>
+  array(1) {
+    [0]=>
+    string(1) "5"
+  }
+}
 bool(true)
 int(6)
 array(2) {