PHP:从数组中获取两个最近的邻居?

时间:2010-11-25 23:12:49

标签: php arrays

我发现this thread是根据已知值从数组中选取最近/最近的值。如果想从一个看同样的数组的数组中选择两个最接近的值呢?

$rebates = array(
   1 => 0,
   3 => 10,
   5 => 25,
  10 => 35)

3 个答案:

答案 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
    );

}

See it!

答案 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件物品可以有相同的距离。