0

私は3つの配列を持っています.1つは低い値の重みを持ち、もう1つは高い値の重みを持ち、3番目はその重み「ブラケット」の実際の値です:

Array 1
(
    [0] => 0.00
    [1] => 2.00
    [2] => 5.00
    [3] => 20.00
    [4] => 50.00
    [5] => 100.00
)
Array 2
(
    [0] => 1.90
    [1] => 4.90
    [2] => 20.00
    [3] => 50.00
    [4] => 100.00
)
Array 3
(
    [0] => 30
    [1] => 50
    [2] => 100
    [3] => 200
    [4] => 500
    [5] => 1000
)

配列 3 から対応する KEY を見つける必要があります。ここで、値 (5.30 としましょう) は配列 1 の値よりも大きく、配列 2 の対応する値よりも小さい (5 より大きく 20 より小さい)。この例の結果は、配列 3 から [2] の配列キーと 100 の値を生成します。

各配列をループしてキーを見つけることもできますが、何らかの方法で配列をマージすることにより、これを行うより高速な方法があることを願っています。

    [2] =>  
        [0] => 5.00
        [1] => 20.00
        [2] => 100

...そして、値が [0] と [1] の間にあるかどうかを確認し、そうであれば [2] を返しますその「ブラケット」の値は [2][2] です。

サンプルコードを使用した結合配列:

Array
(
    [0] => Array
        (
            [0] => 0.00
            [1] => 1.90
            [2] => 30
        )

    [1] => Array
        (
            [0] => 2.00
            [1] => 4.90
            [2] => 50
        )

    [2] => Array
        (
            [0] => 5.00
            [1] => 20.00
            [2] => 100
        )

    [3] => Array
        (
            [0] => 20.00
            [1] => 50.00
            [2] => 200
        )

    [4] => Array
        (
            [0] => 50.00
            [1] => 100.00
            [2] => 500
        )

    [5] => Array
        (
            [0] => 100.00
            [1] => 
            [2] => 100
        )

)
4

1 に答える 1

1

入力データがこのような不運な方法で構造化されていなければ、はるかに簡単になります。

とにかく、これを速くしたい場合、適切な解決策はおそらく手動ループです:

// possibly add some error checking
foreach($lows as $i => $low) {
    if ($value >= $low && isset($highs[$i]) && $value <= $highs[$i]) {
        return $values[$i];
    }
}

あなたが求めていることをする(配列をマージする)には、次を使用できますarray_map

$merged = array_map(
          function($low, $high = null, $value) {
              return func_get_args();
          },
          $lows, $highs, $values);

その後:

foreach($bands as $band) {
    if($value >= $band[0] && $band[1] && $value <= $band[1]) {
        return $band[2];
    }
}
于 2012-06-20T09:23:32.477 に答える