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

プリント:

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

プリント:

    配列
    ((
        [0] =>productname2//製品名
        [1] =>10//製品価格
    )。

どちらの形式にも、次の3つのステップしか含まれていません。

  • 製品コストと予算の差を計算します
  • これらを並べ替える
  • ソートされた配列から最初の要素(価格が予算に最も近い要素)を取得します。

編集:最も近い単一の製品以外を気にしない場合は、並べ替えはやり過ぎであり、単純な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

これを行う機能的な方法は次のとおりです。

  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 に答える
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 に答える