2015-12-28 51 views
0

我有搜索最近搜索的數字的腳本。 因此,例如,讓說,在陣列此數字:以遞歸方式轉換我的腳本?

'0'=> 1.72

'0.25'=> 1.92

'0.75'=> 2.35

「1 '=> 3.00

我在尋找0.50讓分,所以0.25和0.75在0.50的相同範圍內。

在這種情況下,我想得到更多的數字,在這個例子中是0.75。

代碼什麼的工作原理是:

function getClosest($search, $arr) { 
    $closest = null; 
    $num_arr = array(); 
    $odd = 0.00; 
    $i = 0; 
    foreach ($arr as $handicap=>$item) { //first closest number 
     if ($closest === null || abs($search - $closest) > abs($handicap - $search)) { 
     $closest = $handicap; 
     $odd = $item; 
     } 
     else{ 
      $num_arr[$handicap] = $item; 
     } 
    } 
    $newclosest = null; 
    $newodd = 0.00; 
    foreach($num_arr as $handicap=>$newitem){ //second closest number 
     if ($newclosest === null || abs($search - $closest) > abs($handicap - $search)) { 
     $newclosest = $handicap; 
     $newodd = $newitem; 
     } 
    } 
    //if difference between first and second number are same 
    if(abs($search - $closest) == abs($newclosest - $search)){ 
     if($newclosest > $closest){ //if second number is greater than first 
      $closest = $newclosest; 
      $odd = $newodd; 
     } 
    } 
    return array('handicap'=>$closest,'odd'=>$odd); 
} 

我看到,我可以在這裏使用遞歸,但我沒有使用遞歸經歷。我知道我需要像這樣調用它:

$rec_arr = getClosest($num_arr,$search); 

但我得到空白頁,即使我轉儲功能輸出。

+0

我還沒有正確檢查它,但你錯誤地定位了你的函數調用 – onerror

回答

1

使用array_map功能,

$data = array('0'=>1.72,'0.75'=> 2.35,'0.25'=>1.92,'1' => 3.00); 
$v = 0.5; // search value 

$x = null; // difference value 
$y = array(); // temporary array 
array_map(function($i)use($data,$v,&$x,&$y){ 
    if(isset($x)){ 
     if($x > abs($i-$v)){ // if difference value is bigger than current 
      $x = abs($i-$v); 
      $y = array($i=>$data[$i]); 
     }else if($x == abs($i-$v)){ // if difference value is same 
      $key = array_keys($y); 
      $y = $key[0] < $i ? array($i=>$data[$i]) : $y; 
     } 
    }else{ // first loop 
     $x = abs($i-$v); 
     $y = array($i=>$data[$i]); 
    } 
},array_keys($data)); 
print_r($y); // result 

輸出Array ([0.75] => 2.35),希望這可以幫助您。

+0

謝謝,這個作品。 – user1814358

1
//$a is array to be searched 
//$s is search key 
//$prev_key and $next_key will be output required 

$a = array('0'=>1,'0.25'=>123,'0.75'=>456,'0.78'=>456,'1'=>788); 
$s = '0'; 

if(isset($a[$s])){ 
    echo $s; 
} 
else{ 

    reset($a);//good to do 

    while(key($a) < $s){ 
     next($a); 
    } 

    $next_key = key($a); 
    prev($a); 
    $prev_key = key($a); 

    echo $prev_key.'-'.$next_key; 
} 

上述代碼使用數組內部指針。我想這可能會幫助你..

來源:https://stackoverflow.com/a/4792770/3202287

+0

也可以,謝謝。 – user1814358