通过比较值从数组返回键

时间:2012-06-20 09:17:07

标签: php arrays comparison sorting

我有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] [0]是'来自'权重,[2] [1]是'到'权重,而''括号'的值是[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
        )

)

1 个答案:

答案 0 :(得分: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];
    }
}