rfc:cyclic-replace
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revisionNext revisionBoth sides next revision | ||
rfc:cyclic-replace [2015/01/08 23:46] – created francois | rfc:cyclic-replace [2015/01/10 19:36] – francois | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Add cyclic string replacements ====== | ====== Add cyclic string replacements ====== | ||
- | * Version: 1.0 | + | * Version: 1.5 |
- | * Date: 2015-01-08 | + | * Creation date: 2015-01-05 |
+ | * Last modification date : 2015-01-10 | ||
* Author: François Laupretre, francois@tekwire.net | * Author: François Laupretre, francois@tekwire.net | ||
* Status: Under discussion | * Status: Under discussion | ||
Line 30: | Line 31: | ||
only when we set the option to loop in the replace array but I didn't find a better name. | only when we set the option to loop in the replace array but I didn't find a better name. | ||
- | Features brought by this RFC to str_[i]replace() : | + | Note that replacements are done in array order. Key values are ignored in replace |
- | * When search is a string and replace an array, cyclic | + | So, features brought by this RFC to str_[i]replace() are : |
- | * When search and replace are arrays, each element of the replace array can now be a string or an array. If it is a string, we have the usual string/ | + | When search is a string and replace an array, cyclic replace is performed. |
+ | This is the ' | ||
+ | |||
+ | When search and replace are arrays, each element of the replace array can | ||
+ | be a string or an array. If it is a string, we have the usual string/ | ||
+ | behavior. If it is an array, cyclic replacement is performed. | ||
+ | So, the 'array search' | ||
+ | ' | ||
+ | |||
+ | Arbitrarily nested subject arrays are now supported, returning exactly the same array structure and preserving keys. Only | ||
+ | values are replaced. | ||
Empty replace arrays are considered as unexpected. When one is provided, an | Empty replace arrays are considered as unexpected. When one is provided, an | ||
- | E_WARNING error is raised and the input subject is returned as-is. | + | E_WARNING error is raised and the input subject is returned as-is. If search is |
+ | an array, this warning can be raised more than once during a single str_[i]replace() | ||
+ | execution, as we raise it each time we meet an empty replace array. | ||
===== Backward Incompatible Changes ===== | ===== Backward Incompatible Changes ===== | ||
Line 57: | Line 70: | ||
Now, this combination of argument types causes the search string to be replaced | Now, this combination of argument types causes the search string to be replaced | ||
- | with elements from the replace array. So, the behavior is different. | + | with elements from the replace array. |
- | The BC break is minimal here as I hope very few people ever relied on a replace | + | Different behavior too each time we meet an empty array as replace |
- | array being converted to ' | + | Previously, as seen above, an E_NOTICE |
+ | was raised and the array was converted to ' | ||
+ | is raised and the subject is returned unchanged. | ||
+ | |||
+ | The support of multi-level arrays as search, replace, and subject brings the same | ||
+ | kind of BC because previous implementations supported one array level only. | ||
+ | So, if provided | ||
+ | been performed. | ||
+ | |||
+ | All these BC breaks are similar and deal with array to string conversions in | ||
+ | previous implementations. I think we can consider them as very low impact because | ||
+ | relying on an array-to-string conversion (with E_NOTICE) when calling these | ||
+ | functions, while theoritically supported, can be considered as broken and very | ||
+ | improbable. | ||
===== Proposed PHP Version(s) ===== | ===== Proposed PHP Version(s) ===== | ||
Line 73: | Line 99: | ||
==== To Existing Extensions ==== | ==== To Existing Extensions ==== | ||
- | Extensions using one the C functions with a modified API need to be adapted (add | + | Extensions using one of the C functions with a modified API (see BC changes in C API above) |
- | a 0 argument to each call). | + | need to be adapted (adding |
+ | the whole php-src tree (outside of string.c). | ||
==== To Opcache ==== | ==== To Opcache ==== | ||
Line 92: | Line 119: | ||
* PHP_STR_ARRAY_REPLACE_EMPTY | * PHP_STR_ARRAY_REPLACE_EMPTY | ||
* PHP_STR_ARRAY_REPLACE_MASK | * PHP_STR_ARRAY_REPLACE_MASK | ||
+ | * PHP_STR_ARRAY_REPLACE_MAX | ||
+ | * PHP_REPLACE_MASK | ||
=== PHP constants === | === PHP constants === | ||
Line 124: | Line 153: | ||
===== Open Issues ===== | ===== Open Issues ===== | ||
- | None | + | ==== Support of arbitrarily-nested search array ==== |
+ | |||
+ | As search array support is now performed using recursion, search can contain | ||
+ | any level of nested arrays, | ||
+ | |||
+ | Note that, in case of multi-level arrays, replace array can be less deep than | ||
+ | search array as, as soon as we find a non-array replace value, this value is | ||
+ | used as replacement string for the whole corresponding search subtree. The opposite | ||
+ | case is very different : If the replace array tree is deeper than the search tree by more | ||
+ | than 1 level, array to string conversion will occur (with E_NOTICE and the | ||
+ | wonderful ' | ||
+ | |||
+ | Recursion also extends the behavior of ' | ||
+ | implementation supported only one-level arrays for search and replace arguments. | ||
+ | |||
+ | This feature is currently under discussion. The trend is towards limiting the search array | ||
+ | to 1 level (allow array of strings only) and, as a consequence, | ||
+ | one more level than search. | ||
===== Unaffected PHP Functionality ===== | ===== Unaffected PHP Functionality ===== | ||
Line 132: | Line 178: | ||
===== Future Scope ===== | ===== Future Scope ===== | ||
- | Propose the addition | + | Proposed: |
+ | |||
+ | * Add (search=null, | ||
+ | |||
+ | * Add similar | ||
===== Proposed Voting Choices ===== | ===== Proposed Voting Choices ===== | ||
- | Not sure of required | + | Required |
===== Patches and Tests ===== | ===== Patches and Tests ===== | ||
Line 154: | Line 204: | ||
Feature request : [[https:// | Feature request : [[https:// | ||
+ | |||
+ | A similar feature request : [[https:// | ||
PR : [[https:// | PR : [[https:// |
rfc/cyclic-replace.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1