Re: [RFC] [Discussion] array_match
| From: | سپهر محمودی | Date: | Sat, 22 Aug 2026 19:31:29 +0000 |
| Subject: | Re: [RFC] [Discussion] array_match | ||
| References: | 1 2 3 4 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-132296@lists.php.net to get a copy of this message | ||
در تاریخ شنبه ۲۲ اوت ۲۰۲۶، ۱۸:۱۴ youkidearitai
<youkidearitai@gmail.com>
نوشت:
> 2026年8月22日(土) 22:31 سپهر محمودی <sepehrphpr@gmail.com>:
> >
> >
> >
> > در تاریخ شنبه ۲۲ اوت ۲۰۲۶، ۱۶:۰۵ youkidearitai
> > <youkidearitai@gmail.com>
> نوشت:
> >>
> >> 2026年8月22日(土) 21:02 سپهر محمودی
> >> <sepehrphpr@gmail.com>:
> >> >
> >> > Hi everyone,
> >> >
> >> > As some of you may know, my previous RFC
> >> > (
array_search_range) faced
> significant opposition and feedback. I have listened to the community and
> officially withdrawn it. Thank you to everyone who took the time to review
> it.
> >> >
> >> > Today, I would like to introduce a new, much simpler, and highly
> focused RFC: array_match()
> >> >
> >> > Currently, if we want to filter an array to find elements containing
> a specific substring, we have to rely on array_filter()
> combined with a
> closure and strpos()/stripos().
> This pattern is not only verbose but
> also carries the performance overhead of executing a PHP closure for every
> single array element.
> >> >
> >> > I am proposing a native function to handle this efficiently in C:
> >> > `array_match(array $array, string $needle, bool $ignore_case =
> false): array`
> >> >
> >> > This function preserves the original keys, safely casts values to
> strings, and provides a clean, intent-revealing syntax. By implementing
> this internally, we can significantly improve both readability and
> execution speed compared to userland polyfills.
> >> >
> >> > You can find all the use cases and examples detailed on the RFC page:
> >> > https://wiki.php.net/rfc/array_match
> >> >
> >> > I look forward to hearing your thoughts and feedback on this proposal!
> >> >
> >> > Best regards,
> >> > Sepehr Mahmoudi
> >> >
> >>
> >> Hi, Sepehr.
> >>
> >> I have some questions.
> >>
> >> - Why need this function? Is not enough in array_filter or array_find?
> >> - In GitHub, There are many use cases in same name functions. from:
> >>
> >> https://github.com/search?q=array_match+language%3APHP&type=code
> >> - In past RFC in str_icontains
> >> https://wiki.php.net/rfc/str_icontains
> >> was declind. So I don't think make sense that "case-insensitive" only
> >> ASCII now.
> >>
> >> For your reference: In big OSS like php-src, We investigate use case
> first.
> >>
> >> Regards
> >> Yuya
> >>
> >> --
> >> ---------------------------
> >> Yuya Hamada (tekimen)
> >> - https://tekitoh-memdhoi.info
> >> - https://github.com/youkidearitai
> >> -----------------------------
> >
> >
> > Hi Yuya,
> >
> > Thank you for taking the time to review the RFC and share your thoughts!
> >
> > > - Why need this function? Is not enough in array_filter or array_find?
> >
> > While array_filter() is great, it requires a Closure for
> > this task.
> For large arrays, the overhead of calling a userland function for every
> single element is significant. array_match() aims to provide a
> fast,
> native C alternative for a very common operation.
> > As for array_find() (introduced in PHP 8.4), it only
> > returns the
> *first* matching element, whereas this proposal filters and returns *all*
> matching elements.
> >
> > > - In GitHub, There are many use cases in same name functions. from:
> > >
> > > https://github.com/search?q=array_match+language%3APHP&type=code
> >
> > I think the high number of custom array_match
> > implementations in
> userland actually proves how much developers need this functionality!
> However, you bring up a valid point regarding potential name collisions (BC
> breaks). If array_match conflicts with too many existing
> codebases, I am
> completely open to bikeshedding the name (perhaps
> array_str_contains() or
> something similar).
> >
> > > - In past RFC in str_icontains
> > > https://wiki.php.net/rfc/str_icontains
> > > was declind. So I don't think make sense that "case-insensitive" only
> > > ASCII now.
> >
> > This is a very solid point. If the $ignore_case parameter
> > brings up
> the same ASCII/Unicode complexities that caused str_icontains
> to be
> declined, I am more than happy to drop the $ignore_case
> parameter
> entirely. A simple, fast, case-sensitive filter would still be highly
> valuable.
> >
> > > For your reference: In big OSS like php-src, We investigate use case
> first.
> >
> > Understood! I have included a few use cases (like log filtering, simple
> search, and performance optimization over Closures) in the RFC. The GitHub
> search link you provided is also a great testament to real-world usage.
> >
> > Thanks again for your feedback, it is very helpful.
> >
> > Best regards,
> > Sepehr
> >
>
> Hi
>
> > I think the high number of custom array_match
> > implementations in
> userland actually proves how much developers need this functionality
>
> No, Could you read carefully userland code of array_match
> functions?
> array_match is seems a lot of use case in implementation, One
> of
> array_match is uses regex in first parameter,
> But other implementation of array_match is not same behavior.
> You should read usecases of userland code.
>
> Regards
> Yuya
>
> --
> ---------------------------
> Yuya Hamada (tekimen)
> - https://tekitoh-memdhoi.info
> - https://github.com/youkidearitai
> -----------------------------
>
Hi Yuya,
Thank you for the valuable feedback and for taking the time to look into
the userland implementations.
I completely agree with your point about the name array_match. Since
"match" is often associated with regex (like preg_match) or can imply
different behaviors in userland, it could be misleading. To make the
function's purpose absolutely clear and consistent with existing PHP
functions, I have renamed the proposal to array_str_contains.
Additionally, I have entirely removed the 3rd parameter ($ignore_case).
You made a great point regarding the ASCII/Unicode complexities, and
considering the history with the rejected str_icontains RFC, it makes
sense to drop it and keep the behavior strictly aligned with
str_contains().
I have updated the RFC to reflect these changes (Version 0.3):
https://wiki.php.net/rfc/array_str_contains
Let me know if you have any further thoughts on this updated version.
Best regards,
Sepehr