Php 通过数组循环以匹配第二个数组中的公共ID的快速方法
我试图系统地循环2个数组,并匹配它们的值以进行快速处理。让我来介绍一下我的具体情况: 阵列1 productID, 公司ID, 名称 价格 阵列2 公司ID, 名称 回扣1, 返修2 我想在Php 通过数组循环以匹配第二个数组中的公共ID的快速方法,php,foreach,Php,Foreach,我试图系统地循环2个数组,并匹配它们的值以进行快速处理。让我来介绍一下我的具体情况: 阵列1 productID, 公司ID, 名称 价格 阵列2 公司ID, 名称 回扣1, 返修2 我想在数组1中循环,当公司ID与数组2中的ID匹配时,我将根据公司ID的rebate1、rebate2值快速计算 现在我正在遍历Array 1,然后在Array 1中的每个项目上,我遍历整个Array 2,查看companyID是否存在。我知道这不是最快/最干净的解决方案 编辑 Array 1的键值如下所示: $a
数组1
中循环,当公司ID
与数组2
中的ID匹配时,我将根据公司ID
的rebate1、rebate2
值快速计算
现在我正在遍历Array 1
,然后在Array 1
中的每个项目上,我遍历整个Array 2
,查看companyID
是否存在。我知道这不是最快/最干净的解决方案
编辑
Array 1
的键值如下所示:
$array1[0]['productID']
$array1[0]['companyID'] (etc...)
$array1[1]['productID']
$array1[1]['companyID'] (etc...)
$array2[0]['companyID']
$array2[0]['rebate1'] (etc...)
$array2[1]['companyID']
$array2[1]['rebate1'] (etc...)
Array 2
的键值如下所示:
$array1[0]['productID']
$array1[0]['companyID'] (etc...)
$array1[1]['productID']
$array1[1]['companyID'] (etc...)
$array2[0]['companyID']
$array2[0]['rebate1'] (etc...)
$array2[1]['companyID']
$array2[1]['rebate1'] (etc...)
使用
companyId
作为数组2的键,即确保
$Array2[$Array1[$i]['companyID']]['companyID'] == $Array1[$i]['companyID']
这使您可以基于companyID
在Array 2中对公司进行固定时间的查找,您可以使用
$Array2[$Array1[$i]['companyID']]['rebate1']`
及
示例:
foreach ($Array1 as $value) {
if (isset($Array2[$value['companyID']])) {
//TODO: use $Array2[$value['companyID']] for calculation
} else {
// TODO: handle case companyID not in $Array2
}
}
我能想到的最简单的方法是使用companyID作为数组2的键:
$companies[$companyID]=array($name,$rebate1,$rebate2)
然后直接引用它,循环数组1
$products[$x]=array($productID,$companyID,$name,$price);
...
$newprice1=$products[$x][3]/$companies[$products[$x][1]][1];
$newprice2=$products[$x][3]/$companies[$products[$x][1]][2];
我的答案与第一个略有不同,请注意阵列…您希望每个阵列的大致尺寸是多少 正如您所说,您的方法并不一定是最快的(看起来像0(n²)),在每个数组中的10000个元素以下,我怀疑您是否能看到任何显著的速度差异 如果在array1中有150000个,在array2中有200000个,那就完全是另一回事了,你必须寻找一个相当于0(logn)的算法 编辑:
foreach ($Array1 as $value) {
if (isset($Array2[$value['companyID']])) {
//TODO: use $Array2[$value['companyID']] for calculation
} else {
// TODO: handle case companyID not in $Array2
}
}
如上所述,如果可以,让我们将数组关联起来:
而不是:
Array2 = array(
0 => array(
'Company_id' => 'Hello',
'rebate_1' => '50%',
)
);
让它:
Array2 = array(
'Hello' => array(
'rebate_1' => '50%',
)
);
然后使用:
if (isset(array2[$company_id]))
{
// do your stuff
}
如果无法修改Array2的结构,那么应该在搜索函数的作用域中动态地对其进行变换,使其看起来如上图所示,然后使用变换后的数组。鉴于您所拥有的元素数量,将Array2转换为关联数组不会花费太长时间。您可以创建一个按公司id索引的新数组,如下所示:
$cid = array_map(function($a) {return $a['companyID'];}, $array2);
$new2 = array_combine($cid, $array2);
这样,您就可以循环第一个数组并访问数据:
foreach ($array1 as $key => $value){
$rebate1 = $new2[$value['companyID']]['rebate1'];
$rebate2 = $new2[$value['companyID']]['rebate2'];
}
将数组2转换为
数组(companyID=>公司信息)
?使用isset
或array\u Key\u exists
进行的键查找速度将显著加快。array 1的键和值是什么?数组2的键和值是什么?或者,换句话说,数组1 productID、companyID、name、price和数组2 companyID、name、rebate1、rebate2是什么意思?为什么不使用数组@DevlshOne是因为数组值无法正确比较。@d我想我明白了,所以基本上按照你对Oswald的回答所说的去做……让我想一想……我想用这个方法,我仍然有一个foreach
在foreach
的内部-不是吗?因为我需要测试array1
中的每个值,而不是array2
中的每个值。Shackrock不需要,所以在您的示例中,假设array2
中只有一个值。记住,array2
也有100个值$array2[0]['companyID']
,$array2[1]['companyID']
,$array2[3]['companyID']
,等等……我假设(或者说,我建议)$array2
不是基于自然数0、1、2等的索引,而是基于companyID
。因此,$array2[$i]['companyID']=$i
.1000表示array1
,100表示aray2
,一旦它们在循环中循环,将在100000范围内产生一些结果。如您的OP评论中所述,如果我是您,我将检查是否可以将array2修改为关联,请参阅上面的编辑