/**
* 比较函数
* @param scalar $var1
* @param scalar $var2
* return bool
*/
function compare($var1,$var2)
{
if($var1>$var2)
{
return 1;
}
elseif($var1==$var2)
{
return 0;
}
else
{
return -1;
}
}
/**
* 二分查找 重构的代码 支持关联数组
* return index 查找目标数字所在的索引
*/
function binsearch_2($var=array(),$searchnum,$type=true)
{
reset($var);
$key=key($var);
while($key!==null) //$key可能为0 所以要用!==null判断
{
$_map[]=$key; //键值映射
next($var);
$key=key($var);
}
echo '
';
print_r($_map);
$left_border = 0;
$right_border = count($_map)-1;
while($left_border<=$right_border)
{
$middle=intval(($left_border+$right_border)/2);
switch(compare($var[$_map[$middle]],$searchnum))
{
case -1:
if($type)
{
$left_border = $middle+1;
}
else
{
$right_border = $middle-1;
}
break;
case 0:
return $_map[$middle];
case 1:
if($type)
{
$right_border = $middle-1;
}
else
{
$left_border = $middle+1;
}
break;
}
}
echo '没有匹配项';
return false;
}
$arr=array('a'=>1,2,3,4,5,6,7,'b'=>8,9,10,11,'c'=>12);
$index = binsearch_2($arr,12,true);
echo $index;
echo $arr[$index];
?>