二分查找要求数据必须是已排序的数组,时间复杂度为O(log n),PHP 7.2完全支持,实现需确保数组升序、使用严格比较、处理边界情况并返回对应索引或-1。

二分查找要求数据必须是已排序的数组,时间复杂度为 O(log n),PHP 7.2 完全支持该算法,无需额外扩展。下面给出清晰、可直接运行的实现步骤与代码。
一、明确前提条件
确保输入数组是升序排列的整数数组(如 [1, 3, 5, 7, 9, 11]),否则结果不可靠。二分查找不适用于无序或含重复值且需找全部索引的场景。
二、核心逻辑拆解
- 设定左右边界:初始时
$left = 0,$right = count($arr) - 1 - 循环判断:当
$left <= $right时继续查找 - 计算中点:使用
$mid = (int)(($left + $right) / 2)避免整数溢出(PHP 7.2 中整除安全) - 比较并缩小区间:
- 若
$arr[$mid] == $target→ 找到,返回$mid - 若
$arr[$mid] < $target→ 目标在右半区,更新$left = $mid + 1 - 若
$arr[$mid] > $target→ 目标在左半区,更新$right = $mid - 1
- 若
- 未找到时返回
-1
三、完整可运行代码(PHP 7.2+)
} // 测试用例
$sortedArray = [2, 4, 6, 8, 10, 12, 14, 16];
echo "查找 10: 索引为 " . binarySearch($sortedArray, 10) . "\n"; // 输出: 4
echo "查找 5: 索引为 " . binarySearch($sortedArray, 5) . "\n"; // 输出: -1
?>
<?php
function binarySearch($arr, $target) {
$left = 0;
$right = count($arr) - 1;
<pre class='brush:php;toolbar:false;'>while ($left <= $right) {
$mid = (int)(($left + $right) / 2);
if ($arr[$mid] === $target) {
return $mid;
} elseif ($arr[$mid] < $target) {
$left = $mid + 1;
} else {
$right = $mid - 1;
}
}
return -1; // 未找到
四、注意事项(PHP 7.2 特别提示)
- 使用
===严格比较,避免类型隐式转换导致误判(如字符串 '5' 和整数 5) - 数组索引从 0 开始,返回值为整数索引,不是第几个元素
- 空数组或非数组输入需前置校验,生产环境建议加
if (!is_array($arr) || empty($arr)) return -1; - PHP 7.2 已废弃
create_function(),本实现不依赖任何废弃函数,完全兼容



















