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

时间:2012-06-26 15:45:52

标签: php arrays search closest

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

$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 个答案:

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

这是一种功能性的方法。

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

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