1

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

$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);
    }

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

4

4 回答 4

3
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] => productname2 // 产品名称
        [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]);
}
于 2012-06-26T15:57:48.787 回答
1
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)));获取产品名称,否则只会吐出值,这不是您想要的。

于 2012-06-26T15:52:51.637 回答
1

您需要返回 KEY,而不是值:

function closest($array, $number) {
    sort($array);
    foreach ($array as $product=>$a) {
        if ($a >= $number) return $product;
    }
    return $product;
}
于 2012-06-26T15:53:06.223 回答
1

这是一种功能性的方法。

  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现在将包含所有最接近预算的产品。

于 2012-06-26T15:57:35.863 回答