<?php
function dump($var)
{
ob_start();
var_dump($var);
$output = ob_get_clean();
$output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output);
$output = '<pre>' . $output . '</pre>';
echo($output);
}
// 得到一个横向/纵向自增的数组
function getArray(int $len){
$arr = [];
for ($i=0;$i<$len;$i++) {
$tmp = 2 * $i - 1;
for ($j=0;$j<$len;$j++) {
$arr[$i][] = $tmp += 2;
}
}
return $arr;
}
function in_array2 (array $arr,int $int)
{
$js = 1; // 次数
$le = count($arr); // 子数组个数
$qb = 0; // 前区间
$hb = $le - 1; // 后区间
$path = "路径:($qb,$qb)||($hb,$hb)";
if ($arr[$qb][$qb] == $int || $arr[$hb][$hb] == $int) {
echo '次数:',$js,'<br/>',$path,'<br/>';
return true;
}
if ($arr[$qb][$qb] > $int || $arr[$hb][$hb] < $int) { // 最小值 最大值
echo '次数:',$js,'<br/>',$path,'<br/>';
return false;
}
while (1) {
$js ++;
$zb = ceil(($qb + $hb) / 2);
$path .= "->($zb,$zb)";
if ($arr[$zb][$zb] == $int) {
echo '次数:',$js,'<br/>',$path,'<br/>';
return true;
}
if ($arr[$zb][$zb] < $int) {
$qb = $zb;
}
if ($arr[$zb][$zb] > $int) {
$hb = $zb;
}
if ($hb - $qb == 1) {
for ($i=$hb-1;$i>-1;$i--) {
$js ++;
$path .= "->($i,$hb)||($hb,$i)";
if ($arr[$i][$hb] == $int || $arr[$hb][$i] == $int) {
echo '次数:',$js,'<br/>',$path,'<br/>';
return true;
}
if ($arr[$i][$hb] < $int && $arr[$hb][$i] < $int) {
echo '次数:',$js,'<br/>',$path,'<br/>';
return false;
}
}
echo '次数:',$js,'<br/>',$path,'<br/>';
return false;
}
}
}
$arr1 = [
[1],
];
$arr2 = [
[1, 3],
[3, 5],
];
$arr3 = [
[1, 3, 5],
[3, 5, 7],
[5, 7, 9],
];
$arr4 = [
[1, 3, 5, 7],
[3, 5, 7, 9],
[5, 7, 9, 11],
[7, 9, 11, 13],
];
$arr5 = [
[1, 3, 5, 7, 9],
[3, 5, 7, 9, 11],
[5, 7, 9, 11, 13],
[7, 9, 11, 13, 15],
[9, 11, 13, 15, 17],
];
//dump(getArray(5));
//$arr = getArray(1000);
$int = 11;
$arr = $arr5;
var_dump(in_array2($arr, $int));