0

我正在尝试系统地循环遍历 2 个数组,并匹配它们的值以进行一些快速处理。让我设置一下我的具体情况:

数组 1 产品 ID、公司 ID、名称、价格

数组 2 companyID、名称、rebate1、rebate2

我想循环遍历Array 1,当companyID匹配 中的 ID 时Array 2,我将根据该rebate1, rebate2值进行一些快速数学运算companyID

现在我正在遍历Array 1,然后在Array 1我遍历整个项目中的每个项目Array 2以查看是否companyID存在。我知道这不是最快/最干净的解决方案......

编辑

的关键值Array 1如下所示:

$array1[0]['productID']
$array1[0]['companyID']  (etc...)
$array1[1]['productID']
$array1[1]['companyID']  (etc...)

的关键值Array 2如下所示:

$array2[0]['companyID']
$array2[0]['rebate1']  (etc...)
$array2[1]['companyID']
$array2[1]['rebate1']  (etc...)
4

4 回答 4

1

对Array 2使用companyIdas 键,即确保

$Array2[$Array1[$i]['companyID']]['companyID'] == $Array1[$i]['companyID']

这使您可以根据Array 2持续查找公司,companyID您可以使用

$Array2[$Array1[$i]['companyID']]['rebate1']`

$Array2[$Array1[$i]['companyID']]['rebate2']`

例子:

foreach ($Array1 as $value) {
  if (isset($Array2[$value['companyID']])) {
    //TODO: use $Array2[$value['companyID']] for calculation
  } else {
    // TODO: handle case companyID not in $Array2
  }
}
于 2013-08-03T14:04:52.683 回答
1

您期望每个阵列的近似大小是多少?

正如您所说,您的方法肯定不是最快的(看起来像 0(n²)),每个数组中的元素低于 10'000 个,我怀疑您是否能看到任何显着的速度差异。

如果您在array1 中有150'000,在array2 中有200'000,那就完全是另一回事了,您必须寻找一个相当为0(log n)的算法。

编辑:

如上所述,如果可以的话,让我们让您的数组关联:

代替:

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 转换为关联的不应该花费太长时间,因为你说你拥有的元素数量。

于 2013-08-03T14:10:33.197 回答
0

我能想到的最简单的方法是使用 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];

我的回答与第一个略有不同,请注意数组......

于 2013-08-03T14:10:17.817 回答
0

您可以创建一个由公司 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'];
}
于 2013-08-03T14:22:38.577 回答