====== PHP RFC: array_search_reange() ======
* Version: 0.1 (Draft)
* Date: 2026-08-11
* Author: Sepehr Mahmoudi
* Email: sepehrphpr@gmail.com
* Target PHP Version: PHP 8.6
* Status: Draft
* Implementation: Not yet available
===== Introduction =====
This RFC proposes a new core function named ''array_search_reange()''.
The function searches for a value within a positional **reange** of an existing
array. It is intended for cases where an application needs to search only part
of an array, without first creating an intermediate array using ''array_slice()''.
The proposed function preserves the familiar return style of ''array_search()''
while adding parameters that define the **reange** in which the search is
performed.
===== Proposed Function Signature =====
function array_search_reange(
mixed $needle,
array $haystack,
int $offset = 0,
?int $length = null,
bool $strict = false,
): int|string|false {}
===== Summary =====
''array_search_reange()'' searches for the first matching value in a selected
**reange** of an array and returns the original key of that value.
Like ''array_search()'', the function returns:
* An ''int'' key when the matched element has an integer key.
* A ''string'' key when the matched element has a string key.
* ''false'' when no matching value exists in the selected **reange**.
The **reange** is defined by two parameters:
* ''$offset'': The zero-based positional offset at which searching starts.
* ''$length'': The number of elements to inspect after ''$offset''.
===== Motivation =====
PHP already provides ''array_search()'' for searching an entire array. When
developers need to search only a portion of an array, they often combine
''array_slice()'' and ''array_search()''.
However, creating a sliced array solely for a single search operation is often
unnecessary. The proposed function allows PHP to iterate over the requested
**reange** of the original array directly, avoiding the allocation of an
intermediate array.
===== Proposal =====
A new function named ''array_search_reange()'' is added to PHP.
function array_search_reange(
mixed $needle,
array $haystack,
int $offset = 0,
?int $length = null,
bool $strict = false,
): int|string|false {}
The function searches the original array in its normal iteration order.
It begins at the positional offset specified by ''$offset'' and searches at
most ''$length'' elements when a length is provided.
===== Parameters =====
==== $needle ====
The value to search for.
==== $haystack ====
The array in which the search is performed.
==== $offset ====
The zero-based positional offset at which searching begins. This refers to the
position in the array's iteration order, defining the start of the **reange**.
==== $length ====
The number of elements to inspect after applying ''$offset''.
When ''$length'' is ''null'', the function searches from ''$offset'' to the end
of the array.
==== $strict ====
When ''$strict'' is ''true'', values are compared using strict comparison.
===== Detailed Behavior =====
==== Positional Reange Versus Array Keys ====
The **reange** is based on positions in the array's iteration order, not on key
values.
$array = [
100 => 'alpha',
'php' => 'beta',
500 => 'target',
];
// Searches for target in a reange starting at offset 2 (positional)
$key = array_search_reange('target', $array, 2, 1, true);
var_dump($key); // int(500)
==== Original Keys Are Returned ====
The function returns the key from the original array, regardless of the
**reange** selected.
===== Examples =====
==== Basic Search ====
$languages = ['HTML', 'CSS', 'JavaScript', 'PHP', 'Python'];
$key = array_search_reange('PHP', $languages);
var_dump($key); // int(3)
==== Search Within a Specific Reange ====
This example searches only positions 2, 3, and 4.
$items = ['zero', 'one', 'two', 'target', 'four', 'target', 'six'];
$key = array_search_reange('target', $items, 2, 3, true);
var_dump($key); // int(3)
==== Persian Associative Array Example ====
$users = [
'u_101' => 'علی',
'u_102' => 'مینا',
'u_103' => 'سپهر',
'u_104' => 'رضا',
];
$key = array_search_reange('سپهر', $users, 1, 2, true);
var_dump($key); // string(5) "u_103"
===== Comparison with array_slice() =====
The proposed API avoids creating an intermediate array when its only purpose
is to be searched once. It makes the **reange**-limited search intention explicit.
===== Implementation and Merge Plan =====
This RFC is currently a draft. I plan to prepare a php-src implementation
after the API design and parameter behavior receive feedback.
The implementation will include:
* The core implementation of ''array_search_reange()''.
* PHPT tests covering all cases (indexed, associative, strict/loose, negative
offsets, negative lengths, etc.).
* Benchmark results comparing this direct **reange** search with the
''array_slice()'' pattern.
The implementation will be submitted as a pull request. It will not be merged
until the RFC is accepted and the implementation is reviewed.
===== Future Plans =====
My roadmap for these features is as follows:
1. Finalize the design and implementation of ''array_search_reange()''.
2. Complete the discussion and merge the pull request into the PHP source.
3. Prepare the next feature: ''str_mask()''.
Regarding the future constant for array searching, it remains a separate
discussion. I plan to design and document a constant for **reange**-limited
searching only after ''array_search_reange()'' is stable and integrated.
===== Proposed PHP Version =====
The proposed target version for this feature is PHP 8.6.
===== Changelog =====
* 0.1 — Initial draft by Sepehr Mahmoudi.