查找最接近变量的值的数组名称


Finding the array name of a value closest to a variable?

我正在尝试找到最接近给定预算的产品

$array = array(
    'productname1' => 5,
    'productname2' => 10,
    'productname3' => 15
)
$budget = 12;

我尝试使用如下所示的函数来查找最接近的值,但它只返回最接近预算的数字而不是产品名称。

   function closest($array, $number) {
        sort($array);
        foreach ($array as $a) {
            if ($a >= $number) return $a;
        }
        return end($array);
    }

我不禁认为有一个更好的实现。任何帮助将不胜感激。

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

指纹:

    字符串(12) "产品名称2"    国际(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] => 产品名称2//产品名称        [1] => 10//产品价格    )

两种格式都只包括三个步骤:

  • 计算产品成本和预算之间的差额
  • 对这些进行排序
  • 从排序数组(价格最接近预算的元素)中获取第一个元素。

编辑:如果你不关心除了单个最接近的产品之外的任何东西,那么排序是矫枉过正的,一个简单的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]);
}
function closest($array, $number) {
     sort($array);
     foreach ($array as $name => $a) {
         if ($a >= $number) return $name;
     }
     return end(array_keys($array));
 }

诀窍出现在这一行:

 foreach ($array as $name => $a) {

在这里,您将$name分配给数组键,$a分配给数组值。既然你想要这个名字,return $name;

另外,如果没有找到匹配项,请执行,end(array_keys($array)));获取产品名称,否则只会吐出值,这不是您想要的。

您需要

返回 KEY,而不是值:

function closest($array, $number) {
    sort($array);
    foreach ($array as $product=>$a) {
        if ($a >= $number) return $product;
    }
    return $product;
}

这是一种功能性方法。

  1. 将每个帖子映射到预算的差异。
  2. 查找最小值。
  3. 过滤掉所有不符合该值的产品。

实现:

$diffs = array_map(function ($value) use ($budget) {
                     return abs($value - $budget);
                   }, $array);
$smallest = min($diffs);
$products = array_filter($array,
                         function ($value) use ($budget, $smallest) {
                           return abs($value - $budget) == $smallest;
                         });

$products现在将包含最接近预算的所有产品。