我有一个数组,里面有大约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
)
有没有更快的方法解决这个问题?
谢谢!
答案 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'];
}
当然,这只有在您进行多次查找时才有用。
注意:只有您希望在给定价格槽和国家/地区没有唯一定义记录的情况下复制中间阵列级别。