快速搜索PHP数组

时间:2017-04-12 20:52:41

标签: php arrays search foreach

我有一个数组,里面有大约3500个数组项,格式如下。我有两个动态变量发生了变化,我需要根据已经知道的price_slot和country来搜索数组以找出row price_value。

我目前得到了以下内容,但这需要太长时间。无论如何我可以加快这种访问速度吗?

PHP功能

$country = US;
$priceSlot = 3;
$priceValue = getPriceValue($priceSlot, $country);


function getPriceValue($priceSlot, $country) {
    // Search in array for price
    foreach ($array as $arrayItem) {
        if ($arrayItem['price_slot'] == $priceSlot && $arrayItem['country'] == $country) {
            return $arrayItem['price_value'];
        }
    }
    return null;
}

数据片段

Array
(
    [0] => Array
        (
            [price_slot] => 1
            [base_price] => Get in Touch
            [country] => US
            [price_multiplier] => 
            [price_value] => Get in Touch
        )

    [1] => Array
        (
            [price_slot] => 2
            [base_price] => 9000
            [country] => US
            [price_multiplier] => 1.3
            [price_value] => 11700
        )

    [2] => Array
        (
            [price_slot] => 3
            [base_price] => 12000
            [country] => US
            [price_multiplier] => 1.3
            [price_value] => 15600
        )

    [3] => Array
        (
            [price_slot] => 4
            [base_price] => 15000
            [country] => US
            [price_multiplier] => 1.3
            [price_value] => 19500
        )

    [4] => Array
        (
            [price_slot] => 5
            [base_price] => 4000
            [country] => US
            [price_multiplier] => 1.3
            [price_value] => 5200
        )

    [5] => Array
        (
            [price_slot] => 6
            [base_price] => 1600
            [country] => US
            [price_multiplier] => 1.3
            [price_value] => 2080
        )

有没有更快的方法解决这个问题?

谢谢!

3 个答案:

答案 0 :(得分:3)

我仍然想着另一种方式,但这更快:

$result = array_filter($array, function($v) use($priceSlot, $country) {
                                   return ($v['price_slot'] == $priceSlot && 
                                           $v['country']    == $country);
                               });

然后你需要访问:

echo current($result)['price_value'];

您可以像price_value这样获得$result

array_filter($array, function($v) use(&$result, $priceSlot, $country) {
                         $result = ($v['price_slot'] == $priceSlot &&
                                    $v['country']    == $country) ?
                                    $v['price_value'] : null;
                     });

答案 1 :(得分:0)

一种可能的解决方案是索引数组(与数据库相同)。通过创建包含您正在搜索的索引的多维数组,您将能够立即返回正确的条目。当您必须获得超过1个条目的价格值时,您肯定会看到性能提升(因为索引成本为1次完整迭代)。请注意,此技术特别适用于索引对象,索引数组值会占用更多内存。

索引数组的示例:

100000000 1506922183 1236189611 306853238

下一步是从索引中获取条目:

$index = array();

foreach ($array as $entry) {
    $country = $index['country'];
    $priceSl = $index['price_slot'];

    if (!isset($index[$country][$pricelSl])) {
        $index[$country][$pricelSl] = array();
    }

    $index[$country][$pricelSl][] = $entry;
}

TL; DR:需要1次完整迭代。检索多个元素时提高性能。速度O(1)。

答案 2 :(得分:0)

为什么不在加载数据时创建数组的键控版本?

foreach ($array as $arrayItem) {
    $hash[$arrayItem['price_slot'] . $arrayItem['country']][] = $arrayItem;
}

之后,按价格槽和国家查找条目可以在固定时间内完成:

function getPriceValue($priceSlot, $country) {
    return $hash[$priceSlot . $country][0]['price_value'];
}

当然,这只有在您进行多次查找时才有用。

注意:只有您希望在给定价格槽和国家/地区没有唯一定义记录的情况下复制中间阵列级别。