Php 通过数组循环以匹配第二个数组中的公共ID的快速方法

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

我试图系统地循环2个数组,并匹配它们的值以进行快速处理。让我来介绍一下我的具体情况:

阵列1 productID, 公司ID, 名称 价格

阵列2 公司ID, 名称 回扣1, 返修2

我想在
数组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修改为关联,请参阅上面的编辑