我发现this thread是根据已知值从数组中选取最近/最近的值。如果想从一个看同样的数组的数组中选择两个最接近的值呢?
$rebates = array(
1 => 0,
3 => 10,
5 => 25,
10 => 35)
答案 0 :(得分:2)
$rebates = array(
1 => 0,
3 => 10,
5 => 25,
10 => 35);
function getArrayNeighborsByKey($array, $findKey) {
if ( ! array_key_exists($array, $findKey)) {
return FALSE;
}
$select = $prevous = $next = NULL;
foreach($array as $key => $value) {
$thisValue = array($key => $value);
if ($key === $findKey) {
$select = $thisValue;
continue;
}
if ($select !== NULL) {
$next = $thisValue;
break;
}
$previous = $thisValue;
}
return array(
'prev' => $previous,
'current' => $select,
'next' => $next
);
}
答案 1 :(得分:2)
“最近的两个”是指两个小于或等于$ items的值?
无论如何,从对其他线程的回答开始,这是
$percent = $rebates[max(array_intersect(array_keys($rebates),range(0,$items)))];
你可以去
$two_nearest = array_slice(array_intersect(array_keys($rebates),range(0,$items)), -2);
$most_near = $rebates[$two_nearest[1]];
$less_near = $rebates[$two_nearest[0]];
这可以使用array_map
缩减为单行,但我认为它已经过头了。
答案 2 :(得分:0)
$rebates = array(
1 => 0,
3 => 10,
5 => 25,
10 => 35)
$distances = array();
foreach($rebates as $key=>$item) {
if ($key == 5) continue;
$distances = abs($rebates[5] - $item);
}
sort($distances, SORT_NUMERIC)
现在你有一个包含数组中所有项目的数组,它们与$ rebates [5]的距离已经排序。所以你可以得到两个最接近的。 或者三个最接近的。不管。
请记住,2件物品可以有相同的距离。