====== RFC: array_str_contains ======
* **Author:** Sepehr Mahmoudi, sepehrphpr@gmail.com
* **Status:** Draft
* **First Published at:** 2026-08-22
* **Target PHP Version:** PHP 8.7
* **Version:** 0.3
===== Introduction =====
Finding elements in an array that contain a specific substring is a very common task in PHP. Currently, developers must rely on ''array_filter()'' combined with a userland closure and ''str_contains()'', or write a custom ''foreach'' loop.
Executing a userland callback for every element in a large array using ''array_filter()'' introduces unnecessary performance overhead. This RFC proposes a native C function, ''array_str_contains()'', to perform this task efficiently, eliminating the closure overhead and providing a much cleaner, more readable syntax.
===== Proposal =====
This RFC proposes the addition of a new array function:
function array_str_contains(
array $array,
string $needle
): array {}
**Parameters:**
* ''$array'': The input array to be searched.
* ''$needle'': The substring to search for within the array values.
The function searches for the exact substring ''$needle'' in the values of the ''$array''. It returns a new array containing only the matched elements.
* The search is **case-sensitive** (consistent with the behavior of ''str_contains'').
* Non-string values in the array are implicitly cast to strings before the check.
* Original array keys are preserved in the returned array.
===== Use Cases =====
This function simplifies many common filtering tasks, including but not limited to:
* **File filtering:** Filtering a list of filenames or paths to find specific extensions (e.g., ''.php'' or ''.jpg'').
* **Log analysis:** Searching an array of log lines to extract entries containing specific keywords like ''"ERROR"'' or ''"Warning"''.
* **Data processing:** Filtering a dataset of URLs, URIs, or text snippets for a specific substring without writing verbose closures.
===== Examples =====
==== Example 1: Basic Substring Search ====
$files = [
'image.jpeg',
'script.php',
'index.PHP',
'document.pdf',
'functions.php'
];
$result = array_str_contains(
$files,
'.php'
);
print_r($result);
/* Output:
Array
(
[1] => script.php
[4] => functions.php
)
*/
**Explanation:** The function searches for the exact substring ''.php'' in the array values. It is case-sensitive, so ''index.PHP'' is not matched. Original array keys are preserved.
==== Example 2: Searching in Log Lines ====
$logs = [
200 => 'INFO: Application started',
201 => 'ERROR: Database timeout',
202 => 'WARNING: CPU load high',
203 => 'ERROR: Invalid user input'
];
$errors = array_str_contains($logs, 'ERROR:');
print_r($errors);
/* Output:
Array
(
[201] => ERROR: Database timeout
[203] => ERROR: Invalid user input
)
*/
**Explanation:** This example demonstrates filtering a list of log messages to easily extract the lines containing the ''"ERROR:"'' substring. Custom keys are maintained in the result.
==== Example 3: Handling Non-String Values ====
$data = [
'user_100',
100,
10055,
'guest',
true
];
$matches = array_str_contains($data, '100');
print_r($matches);
/* Output:
Array
(
[0] => user_100
[1] => 100
[2] => 10055
)
*/
**Explanation:** Non-string values are implicitly cast to strings before the comparison. For instance, the integer ''100'' becomes the string ''"100"'', which successfully matches the needle ''"100"''.
===== Polyfill / Userland Equivalent =====
The behavior of the proposed function can be illustrated by the following userland implementation. (Note: This approach uses a standard loop to avoid the closure overhead typical of ''array_filter()''):
function array_str_contains(array $array, string $needle): array {
$result = [];
foreach ($array as $key => $value) {
// Cast to string to handle non-string values safely, matching str_contains behavior
if (str_contains((string) $value, $needle)) {
$result[$key] = $value;
}
}
return $result;
}
===== Backward Incompatible Changes =====
None.
===== Proposed PHP Version(s) =====
Next minor version (PHP 8.7).
===== RFC Impact =====
* **SAPIs:** No impact.
* **Existing Extensions:** No impact.
* **Opcache:** No impact.
===== Open Issues =====
None at this time.
===== Proposed Voting Choices =====
State whether to accept the RFC and merge the patch into PHP 8.7. As this is a standard feature addition, it requires a 2/3 majority to pass.
===== Implementation =====
In Progress (TBD).