此函数按键值在数组中搜索最接近的元素,并返回键值对,或在未找到时返回 false。
<?php
function nearest($array, $value, $exact=false) {
$next = false;
$prev = false;
$return = false;
if(!isset($array[$value]) && !$exact) {
$array[$value] = '-';
}
if($exact && isset($array[$value])) {
$return = Array($value=>$array[$value]);
} else {
ksort($array); while ( !is_null($key = key($array)) ) {
$val = current($array);
if($key == $value) {
prev($array); $prev = key($array);
next($array); next($array); $next = key($array);
break;
}
next($array);
}
if($prev && $next) {
if(($long - $prev) > ($next - $long)) {
$return = Array($prev=>$array[$prev]);
} else {
$return = Array($next=>$array[$next]);
}
} elseif ($prev || $next) {
if($prev) {
$return = Array($prev=>$array[$prev]);
} elseif ($next) {
$return = Array($next=>$array[$next]);
}
}
}
return $return;
}
?>
示例用法(用于在数组中查找最接近的颜色)
<?php
$mycolors= Array(
5001046=>'Abbey',
1774596=>'Acadia',
8171681=>'Acapulco',
6970651=>'Acorn',
13238245=>'Aero Blue',
7423635=>'Affair',
8803850=>'Afghan Tan',
13943976=>'Akaroa',
16777215=>'Alabaster',
16116179=>'Albescent White',
10176259=>'Alert Tan',
30371=>'Allports'
);
$color = 'C0C0C0';
$colorlong = base_convert($color,16,10);
$result = nearest($mycolors, $colorlong, true);
if($result) {
echo "找到与 #" . $color . " 完全匹配的颜色,该颜色被称为 '" . $result[key($result)] . "'";
} else {
echo "没有找到完全匹配";
}
if(!$result) {
$result = nearest($mycolors, $colorlong, true);
if($result) {
echo "与 #" . $color . " 最接近的颜色是 #" . base_convert(key($result),10,16) . ",该颜色被称为 '" . $result[key($result)] . "'";
} else {
echo "没有找到与 #" . $color 的匹配项;
}
}
?>