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.,
.phpor.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).