在数组数组中搜索两个东西的最快方法是什么?

时间:2014-04-05 23:48:21

标签: php arrays optimization multidimensional-array

如果我有两个数字:state_idproduct_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_idproduct_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使用字典的数组中的两个数字?

1 个答案:

答案 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!
    }
}

快得多^ _ ^