2015-12-17 33 views
-2

我需要找到左邊-對應於變量值的基本數組的近端鍵。根據數組值之間的變量值查找數組的鍵值

搜索的值(在這種情況下)始終是1和779

更好地之間用一個例子:

$fixedArr = [ 0, 5, 8, 20, 40, 60, 90, 135, 780 ]; 

$search = 42; // $result = $arr[4] -> 4; 
$search = 110; // $result = $arr[6] -> 6; 

$search = 134; // $result = $arr[6] -> 6; 
$search = 135; // $result = $arr[7] -> 7; 

我嘗試用foreach循環,但沒有運氣,任何想法? 感謝

+0

搜索...搜索...搜索...使用['array_search'](http://php.net/manual/en/function.array- search.php)... –

+0

即使搜索值不存在於數組中? – Mindexperiment

+0

你想要最近的鍵或索引之間的數組? – splash58

回答

1

搜索值始終之間(在這種情況下)1和779

$fixedArr = [ 0, 5, 8, 20, 40, 60, 90, 135, 780 ]; 

$search = 42; 
for ($i = 0; $i < count($fixedArr); $i++) 
    if ($search < $fixedArr[$i]) break; 

echo $i-1; 
+0

這可能是答案,但我認爲count應該在for循環之外,if語句應該是$ search **> ** $ fixedArr [$ i]。我試一試 – Mindexperiment

+0

@Mindexperiment我的工作現在有效嗎? –

+0

@ splash58如果你提出修改建議你的答案將是答案 – Mindexperiment

0

使用array_search

array_search - 搜索給定值的數組,並返回相應的鍵,如果成功

$search = array_search(42, $fixedArr); // -> 4 
$search = array_search(110, $fixedArr); // -> 6 

你的問題是類似的尋找最接近的一種:

<?php 
    $fixedArr = [ 0, 5, 8, 20, 40, 60, 90, 135, 780 ]; 
    function getClosest($search, $arr) { 
     $left = 0; 
     foreach ($arr as $val) { 
      if ($search > $val) 
       $left = $val; 
      elseif ($search < $val) { 
       $right = $val; 
       break; 
      } 
      else { 
       $right = $val; 
       break; 
      } 
     } 
     return array($left, $right, array_search($left, $arr), array_search($right, $arr), (($search - $left) > ($right - $search) ? array_search($right, $arr) : array_search($left, $arr))); 
    } 
    print_r(getClosest(4, $fixedArr)); 
?> 
+0

如果'42'不在數組中? –

+0

我不明白? https://eval.in/487181 – splash58

+0

@NiranjanNRaju更新時間 –

1

這可能會幫助你;

$fixedArr = [ 0, 5, 8, 20, 40, 60, 90,135,780 ]; 
// 
$search = 111; // $result = $arr[4] -> 4; 
//$search = 110; // $result = $arr[6] -> 6; 
// 
function leftORright($fixedArr,$search){ 
    $max = max($fixedArr)+1; 
    $near = array(
    'left'=>array('key'=>'none','value'=>'none','bool'=>false), 
    'right'=>array('key'=>'none','value'=>$max,'bool'=>false), 
    'center'=>array('key'=>'none','value'=>'none','bool'=>false) 
    ); 
    foreach($fixedArr as $k=>$v){ 
     if($v == $search){ 
      $near['center']['key'] = $k; 
      $near['center']['value'] = $v; 
     } 
     if($v < $search){ 
      $near['left']['key'] = $k; 
      $near['left']['value'] = $v; 
     } 
     if($v > $search and $near['right']['value'] > $v){ 
      $near['right']['key'] = $k; 
      $near['right']['value'] = $v; 
     } 
    } 
    //decide near left or right 
    $respright = $near['right']['value'] - $search; 
    $respleft = $search - $near['left']['value'] ; 
    $right_left_equals = false; 
    if($near['center']['value'] !== 'none'){ 
     $near['center']['bool'] = true; 
    }else if($respleft < $respright && $near['left']['key']!='none'){ 
     $near['left']['bool'] = true; 
    }else if($respleft > $respright && $near['right']['key']!='none'){ 
     $near['right']['bool'] = true; 
    }else if($near['center']['value'] != 'none'){ 
     $near['center']['value'] = true; 
    }else{ 
     $right_left_equals = true; 
    } 
    //var_dump($near); 
    //Result is: 
    foreach($near as $k=>$v){ 
     foreach($v as $k2=>$v2){ 
      if($v2===true){ 
       var_dump('near is for '.$k); 
       return $v; 
      } 
     } 
    } 
    //equal for right and left 
    if($right_left_equals){ 
     var_dump('near right left are equals'); 
     return array($near['right'],$near['left']); 
    } 
} 
$result = leftORright($fixedArr,$search); 
var_dump($result); 

響應:

string 'near is for left' (length=16) 

array (size=3) 
    'key' => int 6 
    'value' => int 90 
    'bool' => boolean true 
0

試試這個:這將適用於所有情況。

$fixedArr = [ 0, 5, 8, 20, 40, 60, 90, 135, 780 ]; 
$find = 14; 
for ($i=0; $i < count($fixedArr); $i++) { 
    if($fixedArr[$i] <= $find){ 
     $large[] = $fixedArr[$i];  
    }else{ 
     $small[] = $fixedArr[$i]; 
    } 
} 
$near1 = max($large); 
$near2 = min($small); 
echo "Value $find coming in between $near1 and $near2"; 
echo "<br>"; 
if($find >= ($near1 + $near2)/2){ 
    echo "Closed Value is : $near2"; 
}else{ 
    echo "Closed Value is : $near1"; 
} 

輸出:

Value 14 coming in between 8 and 20 
Closed Value is : 20