【问题标题】:return key from array by comparing values通过比较值从数组中返回键
【发布时间】:2012-06-20 09:17:07
【问题描述】:

我有 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
        )

)

【问题讨论】:

    标签: php arrays comparison sorting


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

    【讨论】:

    • 这个例子的理想结构是什么?
    • @Innate: 就像你最终想要做的事情:)
    • 我想这会改变我的问题,那么使用新数组,返回值的最快方法是什么?
    • @Innate:与第一种方法几乎相同。我更新了答案。
    • 优秀的回答乔恩,谢谢。我已经将它封装在一个函数中并成功应用它。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    相关资源
    最近更新 更多