-1

我有一个这样的数组:

$d=array('good'=>10,'very good'=>20,'bad'=>1);

当 13 个数字最接近数组的值时,我想从中找到密钥。

例如$d数组中的 16 接近 20。

像结果:

key:very good
value:20

代码

$d=array('good'=>10,'very good'=>20,'bad'=>1);

$find=13;
foreach(array_chunk($find, 5) as $val) {
    echo reset($val) . "-" . end($val);
}

对不起我的英语不好。

4

4 回答 4

2

你可以试试

$d = array('good' => 10,'very good' => 20,'bad' => 1);

vprintf("Find:%d, Closest: %d, Grade: %s\n",findClosest($d,13));
vprintf("Find:%d, Closest: %d, Grade: %s\n",findClosest($d,16));

输出

Find:13, Closest: 10, Grade: good
Find:16, Closest: 20, Grade: very good

使用的功能

function findClosest($array, $find) {
    $map = array_map(function ($v) use($find) {
        return abs($v - $find);
    }, $array);
    asort($map);
    return array($find,$array[key($map)],key($map));
}
于 2012-12-26T11:42:28.823 回答
1

这不是很漂亮的代码,但我认为它可以满足您的要求。

$d=array('good'=>10,'very good'=>20,'bad'=>1);

$closest = array('int' => -1, 'key' => null);
$find = 16;
foreach($d as $k=>$v) {
    if ($closest['int'] == -1) { $closest['int'] = abs($find-$v); $closest['key'] = $k; continue; }
    if (abs($find - $v) < $closest['int']) {
        $closest['int'] = abs($find-$v);
        $closest['key'] = $k;
    }
}

echo "key:".$closest['key']."
value:".$d[$closest['key']];
于 2012-12-26T11:38:23.780 回答
0

试试代码

$d = array('good'=>10,'very good'=>20,'bad'=>1);
$find=13;

$result = get_closest($d , $find);
echo $result;

function get_closest($array  = array(), $key){
     $new_arr = array();
     foreach($array AS $index=>$arr){
         if($key < $arr)  {
            $new_arr[$index] = $arr - $key;
         }
         else{
             $new_arr[$index] = $key - $arr;
         }
     }

     $min_val = min($new_arr);
     $res = array_search( $min_val , $new_arr);
     return $res;
   }

谢谢

于 2012-12-26T11:49:51.203 回答
-1

您可以使用array_values函数将所有值作为$a,然后您可以对$a进行排序。排序后您可以在$find之间找到两个数字,然后您可以比较这两个数字。

于 2012-12-26T11:38:02.657 回答