如果我有两个数字:state_id
和product_id
,找出一对是否作为我的数组中的元素存在的最佳方法是什么?
这是我的数组的样子:
Array
(
[0] => Array
(
[StateProduct_Id] => 1
[State_Id] => 2
[Product_Id] => 1
[StateProduct_Price] => 160
)
.....
[102] => Array
(
[StateProduct_Id] => 103
[State_Id] => 10
[Product_Id] => 5
[StateProduct_Price] => 210
)
)
我正在考虑迭代每个元素并使用if语句来测试来自一个数组的数字对是否与for循环中正在测试的当前元素的state_id
和product_id
匹配。显然,如果他们匹配,我想要发生一些事情,(更新价格)。这是最好的方式吗?每个数字对总是匹配。
这是我目前的设置:
for($i = 0; $i < count($myOwnArray); $i++){
for($n = 0; $n < count($stateProductPricesArray); $n++){
if( $stateProductPricesArray[$n]['State_Id'] == $myOwnArray[$i]['State_Id']
&& $stateProductPricesArray[$n]['Product_Id'] == $myOwnArray[$i]['Product_Id']){
//Do something. Update the price for myOwnArray by grabbing the price from the StateProductPricesArray
}
}
}
这是解决这个问题的最好方法,还是有更快的方式来search
使用字典的数组中的两个数字?
答案 0 :(得分:4)
你的算法是O(n2)
,它非常慢,并且根本无法扩展。
相反,请考虑预填充查找:
$separator = " -- "; // any separator is okay, so long as it doesn't appear in values
$map = array();
foreach($stateProductPriceArray as $i=>$item) {
$map[$item['State_Id'].$separator.$item['Product_Id']] = $i;
}
foreach($myOwnArray as $row) {
if( isset($map[$row['State_Id'].$separator.$row['Product_Id']])) {
$product = $stateProductPriceArray[$map[$row['State_Id'].$separator.$row['Product_Id']]];
// do something!
}
}
快得多^ _ ^