> On Jun 25, 2024, at 4:51 PM, Gina P. Banyard <intern...@gpb.moe> wrote: > > > On Tuesday, 25 June 2024 at 19:06, Mike Schinkel <m...@newclarity.net> wrote: >> >> strtok() >> ===== >> strtok() is found 35k times in GitHub: >> >> https://github.com/search?q=strtok%28+language%3APHP+&type=code >> <https://github.com/search?q=md5%28+language%3APHP+&type=code> >> >> It is a commonly used as a "left part of string up to a character" in >> addition to its intended use for tokenizing. >> >> I would prefer not deprecated because of BC breakage, but IF it is >> deprecated I would suggest adding a one-for-one replacement function for the >> "left part of string up to a character" use-case; maybe >> `str_left("abc.txt",".")` returning `"abc"`. > > > For this exact case of extracting a file name without an extension, you > should really just use: > pathinfo($filepath, PATHINFO_FILENAME); > But for something more generic, you can just do: > explode($delimiter, $str)[0]; > > So I really don't see why we would need an "str_left()" function.
Ah, the dangers of providing a specific example of a broader use-case is that someone will invariably discredit the specific example instead of focusing on the applicability for the broader use-case. 🤦‍♂️ To wit, here are seven (7) use-cases for which `pathinfo()` is not a viable alternative: https://3v4l.org/RDYFs#v8.3.8 <https://3v4l.org/RDYFs#v8.3.8> Note those seven use-cases are found in around the first 25 results when searching GitHub for "strtok(". I could probably find more if I kept looking: https://github.com/search?q=strtok%28+language%3APHP+&type=code <https://github.com/search?q=strtok%28+language%3APHP+&type=code> Regarding explode($delimiter, $str)[0] — unless it is to be special-cased during compilation —it is a really inefficient way to find the substring up to the first character, especially for large strings and/or when in a tight loop where the explode is contained in a called function. Here is a benchmark (https://onlinephp.io/c/87341) showing that — on average of the runs I performed — for using `strtok()` to fully process through a 3972 byte file with 359 commas it took right at 90 times longer using explode($delimiter, $str)[0] vs. strtok($str,$delimiter). Imagine is the file were 39,720 bytes, or larger, instead. Size of file: 3972 Number of commas: 359 Time taken for strtok: 0.0034 seconds Time taken for explode: 0.3036 seconds Times strtok() faster: 89.1 Yes the above processes the entire file using explode()[0] each time rather than first using explode(",") once — because of the equivalent of the N+1 problem[1] where the explode() is buried in a function. This illustrates why strtok() is so good for its primary use-case of parsing text files. strtok() is fast and does not use heaps of memory on every token. This leads me to think `strtok()` should not be deprecated given how inefficient string handling in PHP can otherwise be, at least not without a much more efficient object for string parsing. -Mike [1] https://www.baeldung.com/cs/orm-n-plus-one-select-problem <https://www.baeldung.com/cs/orm-n-plus-one-select-problem>