Path: csiph.com!usenet.pasdenom.info!gegeweb.org!usenet-fr.net!feeder1-2.proxad.net!proxad.net!feeder2-2.proxad.net!npeer.de.kpn-eurorings.net!npeer-ng0.de.kpn-eurorings.net!newsfeed.arcor.de!newsspool2.arcor-online.net!news.arcor.de.POSTED!not-for-mail Content-Type: text/plain; charset="UTF-8" Message-ID: <1816957.0LDT0NebiR@PointedEars.de> From: Thomas 'PointedEars' Lahn Reply-To: Thomas 'PointedEars' Lahn Organization: PointedEars Software (PES) Date: Sun, 16 Feb 2014 15:10:21 +0100 User-Agent: KNode/4.11.5 Content-Transfer-Encoding: 8Bit X-Face: %i>XG-yXR'\"2P/C_aO%~;2o~?g0pPKmbOw^=NT`tprDEf++D.m7"}HW6.#=U:?2GGctkL,f89@H46O$ASoW&?s}.k+&. MIME-Version: 1.0 Lines: 86 NNTP-Posting-Date: 16 Feb 2014 15:10:25 CET NNTP-Posting-Host: bfa2cebe.newsspool1.arcor-online.net X-Trace: DXC=J`aCV^?S\aKX36K@\WTHGJic==]BZ:afN4Fo<]lROoRAnkgeX?EC@@@:HSIQ^WeSTBDZm8W4\YJNLYUVHKH;GI^GnQi[[ZMHf2@`j1aK0LZ?WC X-Complaints-To: usenet-abuse@arcor.de Xref: csiph.com comp.lang.php:12840 Jason C wrote: > I know that I'm talking about microseconds here, so this is really just > for the sake of furthering my own education. > > I'm looping through roughly 100,000 values: > > $userArr = array( > "something" => "anything", > ... > ); > > foreach ($userArr as $key => $val) { > $firstname = str_replace($key, "****", $firstname); > $lastname = str_replace($key, "****", $lastname); > } > > Both $firstname AND $lastname could contain any of the keys, but could > only potentially contain one key each. It's likely, though, that neither > will contain any of the keys. I do not see the point of this code. Assuming complete code, $firstname and $lastname are NULL in the first loop (issuing a notice each), therefore '' in subsequent loops (str_replace() returns that when the “haystack” is NULL). Even if they were not, what sense does it make to replace parts of names, that match array keys, with “****”? > Would it be faster to use strpos() before each str_replace(), like so?: > > foreach ($userArr as $key => $val) { > if (strpos($firstname, $key) !== false) > $firstname = str_replace($key, "****", $firstname); > > if (strpos($lastname, $key) !== false) > $lastname = str_replace($key, "****", $lastname); > } Most certainly not. > My instinct is that it would be the same, Why do you think doing something twice would be as fast as doing it only once? > if not marginally slower; It would obviously be slower, already because str_replace() has to search for the substring before it can replace it. Even if str_pos() somehow stored the position of the first occurrence of the substring, and str_replace() would use that, a) it would still take additional time to access that stored value and b) it would still be possible that there is more than one occurrence of the substring in the string to be searched, which str_pos() could not have stored. > allowing a potential computation time for 100,002 strpos() as opposed to > 100,000 str_replace(). Your logic is flawed: The worst case scenario is that *both* functions are called. > Or, would strtr() be faster? I've never actually used this function in > practice; I think it's a slow function, but have never tested it, and > don't remember where I read that: > > $firstname = strtr($firstname, $userArr); > $lastname = strtr($lastname, $userArr); It is possible that strtr() when called with a second array parameter could be faster than str_replace(), but by contrast to str_replace() it has no way of limiting the number of replacements. Also, str_replace() supports array parameters both for “search” and “replace” as well. > Any other suggestions on what might be the fastest option? Perhaps, if I could see the point of your code. PointedEars -- Anyone who slaps a 'this page is best viewed with Browser X' label on a Web page appears to be yearning for the bad old days, before the Web, when you had very little chance of reading a document written on another computer, another word processor, or another network. -- Tim Berners-Lee