我正在尝试找到与给定预算最接近的产品
$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);
}
我不禁想到有更好的实现。任何帮助将不胜感激。
答案 0 :(得分: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
打印:
string(12) "productname2" int(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));
打印:
Array ( [0] => productname2 // Product Name [1] => 10 // Product Price )
这两种格式只包含三个步骤:
编辑:如果你不关心最近的单个产品,那么排序就是矫枉过正,一个简单的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]);
}
答案 1 :(得分: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)));
以获取产品的名称,否则它只会吐出值,这不是您想要的。
答案 2 :(得分:1)
您需要返回KEY,而不是值:
function closest($array, $number) {
sort($array);
foreach ($array as $product=>$a) {
if ($a >= $number) return $product;
}
return $product;
}
答案 3 :(得分:1)
这是一种功能性的方法。
实现:
$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
现在将包含最接近预算的所有产品。