-1

私はこのような配列を持っています:

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

配列の最も近い値が13個あるときに、そこからキーを見つけたいです。

たとえば、16 は$darray の 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 の間で 2 つの数値を見つけることができ、それらの 2 つの数値を比較できます。

于 2012-12-26T11:38:02.657 に答える