【问题标题】:Finding the array name of a value closest to a variable?查找最接近变量的值的数组名称?
【发布时间】:2012-06-26 15:45:52
【问题描述】:

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

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

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

【问题讨论】:

  • 您想要最接近的值吗?还是第一个高于该值的值?因为预算为 12,最接近的值为 10 - 您需要检查预算与价格之间差异最小的产品。
  • @andrewsi Nearest 没问题。我对变量有点误导,它不会在这里出现。

标签: php arrays search closest


【解决方案1】:
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]);
}

【讨论】:

    【解决方案2】:
    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))); 获取产品名称,否则只会吐出值,这不是您想要的。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        这是一种实用的方法。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-06
          • 2019-06-01
          • 2015-08-03
          • 2014-03-31
          • 1970-01-01
          • 2021-12-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多