foreach($array as $k => $v){ $diff[abs($v - $budget)] = $k; }
ksort($diff, SORT_NUMERIC);
$closest_key = current($diff);
var_dump($closest_key); // Product Name
var_dump($array[$closest_key]); // Product Cost
プリント:
string(12) "productname2"
int(10)
または関数として:
function closest($array, $price)
{
foreach($array as $k => $v){ $diff[abs($v - $price)] = $k; }
ksort($diff, SORT_NUMERIC);
$closest_key = current($diff);
return array($closest_key, $array[$closest_key]);
}
print_r(closest($array, $budget));
プリント:
配列
((
[0] =>productname2//製品名
[1] =>10//製品価格
)。
どちらの形式にも、次の3つのステップしか含まれていません。
- 製品コストと予算の差を計算します
- これらを並べ替える
- ソートされた配列から最初の要素(価格が予算に最も近い要素)を取得します。
編集:最も近い単一の製品以外を気にしない場合は、並べ替えはやり過ぎであり、単純なmin()
関数(Emilが使用するような)の方がはるかに高速です。例えば:
function closest($array, $price)
{
foreach($array as $k => $v){ $diff[abs($v - $price)] = $k; }
$closest_key = $diff[min(array_keys($diff))];
return array($closest_key, $array[$closest_key]);
}