【问题标题】:Find key of array based on variable value between array values [duplicate]根据数组值之间的变量值查找数组的键
【发布时间】:2016-03-24 05:14:35
【问题描述】:

我需要找到对应于变量值的基本数组的 left-near 键。

搜索值(在这种情况下)始终介于 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 循环,但没有运气,知道吗? 谢谢

【问题讨论】:

  • 搜索...搜索...搜索...使用array_search...
  • 即使搜索到的值不存在于数组中?
  • 你想要数组的最近的键或索引在哪个之间?
  • 我用一个新的例子更新了这个问题
  • -1 和 800 的结果是什么?

标签: php arrays


【解决方案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;

【讨论】:

  • 这可能是答案,但我认为计数应该在 for 循环之外,并且 if 语句应该是 $search > $fixedArr[$i] 。我试一试
  • @Mindexperiment 我的现在还能用吗?
  • @splash58 如果您做出建议的更改,您的答案将是您的答案
  • @Mindexperiment 你为什么这么认为?
  • 很抱歉,只注意循环外的计数更快, 很好。这是正确的答案。摇滚乐!
【解决方案2】:

这也许对你有帮助;

$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

【讨论】:

    【解决方案3】:

    使用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));
    ?>
    

    【讨论】:

    • 我不明白什么? eval.in/487181
    • 如果42不在数组中怎么办??
    • @NiranjanNRaju 已更新。
    • 来自here??
    • @NiranjanNRaju 是的,更新了。
    【解决方案4】:

    试试这个:它适用于所有情况。

    $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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 2018-02-05
      相关资源
      最近更新 更多