我正在尝试找到最接近给定预算的产品
$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;
}
这是一种功能性方法。
- 将每个帖子映射到预算的差异。
- 查找最小值。
- 过滤掉所有不符合该值的产品。
实现:
$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
现在将包含最接近预算的所有产品。