De : Nikita Popov [mailto:nikita....@gmail.com] > > str_replace is a simple function for string replacement. It has some (imho > also unnecessary) > extra gimmicks to implicitly do a foreach() loop during the replacement. This > is still relatively > simple API-wise. But if I see this (taken from the tests) as the search & > replacement values...
> $search=array('[?]',array('(?)','d','e'),'a','R'); > $repl=array( > array('ap(?)z[?]',"b[?](?)v",null,37,"[?]n[?]"), > array('a',array('b',null)), > array('k(?)j[?]') >); > ... I have a pretty hard time figuring out what this is actually supposed to > do. This is not a real use case, this is edge-case testing ! > At this point str_replace is working on arbitrarily-nested arrays and also > has four options to control its behavior. > Imho this is just too much complexity for a relatively minor use case. Let's take this one by one : First, this all started with two feature requests for this feature. I then asked on the list what people thought about it and the return what 100% positive. So, I started a first implementation to just allow cyclic replace with a loop behavior. At this time, an empty replace array was considered as an empty string, with no warning. Then R. Quadling complained that we should provide a way to control what happens when we arrive at the end of the replace array. I hadn't done it because I didn't want to change the API. We finally agreed on an additional options arg with five possible values. I don't like the additional arg but I accept it because : 1. It is added as last arg and most people will never see it, and 2. it can be useful if we need additional flags in the future. For instance, if we had defined this arg at the beginning, it could have handled case-sensitivity, which wouldn't have been worse than writing a sister function. I even think now to define a STR_REPLACE_CASE_INSENSITIVE flag as an alternative to str_ireplace(). This would provide all str_[i]replace features in a single function (don't worry, the BC break is too huge to deprecate str_ireplace()). Then, you asked for an error on empty replace array. I added that. Then, it came to my mind that, if we accept the combination of (string search, array replace).we must be consistent and, as we already accept (array search), we must also accept ((array of arrays) replace). The extension to arbitrarily-nested arrays is not essential but it didn't cost much and allowed for a cleaner multi-layered C design. Honestly, I hope we keep supporting it because removing it would add complexity in the code but I am not sure we must document recursion support beyond 1 level for search / 2 levels for replace (even if side notes will quickly document it). I agree that supporting (array search) may be a wrong decision (more complexity, just for performance reasons), but it was made a long time ago and a lot of people use it now... I then thought that, as I had (quite useless) recursion for search/replace, the least I could do was to provide the same for subject because, here, it is really valuable. It is a quite natural use case to want converting every strings in an arbitrarily-nested array and I imagine people will quickly use this. As before, it also brings a cleaner design in C code. To summarize, I started with a rather simple feature request and was then pushed by external wishes. About added complexity in code, the summary is about 100 lines of new (cruelly missing) comments, 100 lines added, and 130 lines modified. The rest comes from additional tests (which could be simpler, ok, ok). If you consider that the design is now simpler to understand, this is not so bad. So, all in all, I think that the whole balance is positive, even if adding an argument is never wanted. That said, I am always open to discussion and will never tell you that it must remain so because I have spent *endless* hours coding it :). Finally, a vote will take place starting January,20, which will probably require 2/3 of voices (not sure because BC break is very minimal, but we are adding an argument...). Sorry for posting in the same thread. I will post a new [RFC]-prefixed message. If you want your arguments to be more visible to newcomers, you may post them in the PR. If you do it, I will then post my reply. Regards François -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php