对某个数组,按照顺序,一个一个比较,找到你要的数据。
<?php
//顺序查找数组中某个数
//如从一个数组中找到一个数:34
//$arr = array(23,45,67,34,9,34,6)如果查到则输出下标,否则输出查无此数
$arr = array(23,45,67,34,9,34,6);
//设一个标志位
$flag = false;
foreach($arr as $x => $x_val)
{
if ($x_val == 34)
{
echo 'arr['.$x.']=34'."<br>";
$flag = true;
}
}
if ($flag==false)
{
echo "查无此数!";
}
?>
首先找到数组中间这个数,然后与要查找的数比较,如果要查找的数大于中间这个数,则说明应该向后找,否则向前找,如果想等,则说明找到。
前提:该数组必须是有序数列,如果该数组无序,必须先排序后查找
递归形式:
<?php
//二分查找数组中某个数
//如从一个数组中找到一个数:134
//$arr = array(23,45,67,89,90,134,236)如果查到则输出下标,否则输出查无此数
function binarySearch(&$arr,$val,$leftindex,$rightindex)
{
if($rightindex < $leftindex)
{
echo "查无此数!";
return 0;
}
//四舍五入取整数值
$middleindex = round(($leftindex + $rightindex)/2);
if($val > $arr[$middleindex])
{
binarySearch($arr,$val,$middleindex + 1,$rightindex);
}
elseif($val < $arr[$middleindex])
{
binarySearch($arr,$val,$leftindex,$middleindex - 1);
}
else
{
echo 'arr['."$middleindex".']=134'."<br>";
}
}
$arr = array(23,45,67,89,90,134,236);
// $leftindex = 0;左下标
// $rightindex = count($arr)-1;右下标
// $val = 134;要找的值
binarySearch($arr,134,0,count($arr) - 1)
?>
非递归形式:
$nums = [-1, 0, 3, 5, 9, 12, 13];
$target = 9;
function search($nums, $target)
{
if (empty($nums)) {
return -1;
}
$l = 0;
$r = count($nums) - 1;
while ($l <= $r) {
$mid = ceil(($l + $r) / 2);
if ($nums[$mid] == $target) {
return $mid;
} elseif ($nums[$mid] > $target) {
$r = $mid - 1;
} else {
$l = $mid + 1;
}
}
return -1;
}
var_dump(search($nums, $target));