Re: Bug 23654: str_replace doesn't handle multidimensional arrays
| From: | pollita@php.net | Date: | Fri, 16 May 2003 17:55:37 +0000 |
| Subject: | Re: Bug 23654: str_replace doesn't handle multidimensional arrays | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-1593@lists.php.net to get a copy of this message | ||
> > I've got fixes for str_replace to let it handle multidimensional arrays,
but
> > I'm not sure if it should be applied to the 4.3 branch or not.
> >
> What is your fix like? Actually the current behaviour is ugly, but I don't
> see the idea str_replace() should always be able to handle multi-dim
> arrays as not all the users want it to do so. At most we'd be better off
> if nested arrays were ignored.
>
That may be the better way to go. The fix I've got will traverse down the
array reentrantly, but it's occured to me that it'll choke on a recursive
array structure (i.e.: $array[] = &$array; ) That's fixable too of
course, but it starts to get progressively ugly. Simply patching in this
should do what you describe and keep everyone happy without making a
significant change in branch. Maybe 5.0 can include an option to traverse
down, maybe not...
Index: ext/standard/string.c
===================================================================
RCS file: /repository/php4/ext/standard/string.c,v
retrieving revision 1.333.2.26
diff -u -r1.333.2.26 string.c
--- ext/standard/string.c 16 May 2003 06:21:39 -0000 1.333.2.26
+++ ext/standard/string.c 16 May 2003 17:52:01 -0000
@@ -2726,8 +2726,12 @@
/* For each subject entry, convert it to string, then
perform replacement
and add the result to the return_value array. */
while (zend_hash_get_current_data(Z_ARRVAL_PP(subject),
(void **)&subject_entry) == SUCCESS) {
- MAKE_STD_ZVAL(result);
- php_str_replace_in_subject(*search, *replace,
subject_entry, result);
+ if (Z_TYPE_PP(subject_entry) != IS_ARRAY &&
Z_TYPE_PP(subject_entry) != IS_OBJECT) {
+ MAKE_STD_ZVAL(result);
+ php_str_replace_in_subject(*search,
*replace, subject_entry, result);
+ } else {
+ result = *subject_entry;
+ }
/* Add to return array */
switch
(zend_hash_get_current_key_ex(Z_ARRVAL_PP(subject), &string_key,
&string_key_len, &num_key, 0, NULL)) {