我下面有 PHP 代码,它将检查两个关联数组。我的问题是,这段代码执行许多循环,我不希望它出现,因为它会影响我的应用程序的性能。 PHP中有什么方法或函数可以自动检测重复吗?结果和我的一样。
请检查样本这里。
这是我的代码:
// first Array
$m1Array = array();
$m1Array[] = array('eId' => '0001', 'numVal' => 1);
$m1Array[] = array('eId' => '0002', 'numVal' => 2);
$m1Array[] = array('eId' => '0003', 'numVal' => 3);
$m1Array[] = array('eId' => '0004', 'numVal' => 4);
$m1Array[] = array('eId' => '0005', 'numVal' => 5);
$m1Array[] = array('eId' => '0006', 'numVal' => 6);
//second Array
$m2Array = array();
$m2Array[] = array('eId' => '0001', 'numVal' => 1);
$m2Array[] = array('eId' => '0004', 'numVal' => 4);
$m2Array[] = array('eId' => '0005', 'numVal' => 5);
$m2Array[] = array('eId' => '0006', 'numVal' => 6);
$m2Array[] = array('eId' => '0007', 'numVal' => 7);
//final result array
$finalResult = array();
//[second array] will be my master or the bases
//loop thru the [second array(m2Array)]
foreach($m2Array as $m2Arr){
$numValSum = 0;
$dupFound = false;
//get current eId value in [second array]
$eId2 = $m2Arr['eId'];
//loop thru the [first array(m1Array)] to check if eId2 has duplicate
$arrIndex = 0;
foreach($m1Array as $m1Arr){
//get current eId value in [first array]
$eId1 = $m1Arr['eId'];
//check if the value of eId2 is equal to eId 1
if($eId1 == $eId2){
//if equal then
//add their respective numVal value and put it to [final result array]
$numValSum = $m2Arr['numVal'] + $m1Arr['numVal'];
$finalResult[] = array('eId' => $eId2, 'numValSum' => $numValSum);
unset($m1Array[$arrIndex]); //remove the duplicate eId in [first array]
sort($m1Array); //sort the index of [first array]
$dupFound = true;
}
$arrIndex += 1;
}
//if eId2 has no duplicate then just add the numVal to [final result array]
if($dupFound == false){
$finalResult[] = array('eId' => $eId2, 'numValSum' => $m2Arr['numVal']);
}
}
//now check if [second array] still have an element
//if still have then add all to [final result array]
if(count($m1Array)){
foreach($m1Array as $m1Arr){
$finalResult[] = array('eId' => $m1Arr['eId'], 'numValSum' => $m1Arr['numVal']);
}
}
//display my final result array
foreach($finalResult as $fRes){
echo $fRes['eId'].' -> '.$fRes['numValSum'].PHP_EOL;
}
附加信息:
抱歉,但我认为你们中的一些人错过了我的代码的要点。我不想删除数组中的重复项。该代码将检查重复投注。两个数组,如果
eId
在另一个数组中有重复项,则在将其放入我的 numVal
或 output
之前添加其相应的 finalResult array
。但如果没有重复的话就直接把它放到我的finalResult array
。
我附上了一张表格图来说明它是如何工作的。
您可以使用
59
来将 3
行代码减少为
array_udiff()
来获取两个多维数组之间的差异。它接受数据比较的函数:
var_dump(array_udiff($m1Array, $m2Array, function($a, $b) {
return $a["eId"] - $b["eId"];
}));
php中没有这样的函数,所以你可以把它拆成碎片:
$finalResult = $a1 = array_column($m1Array, "numVal", "eId");
$a2 = array_column($m2Array, "numVal", "eId");
array_walk($finalResult, function(&$item, $key) use ($a2) {
if(isset($a2[$key])) $item += $a2[$key];
});
$finalResult = array_merge($finalResult, array_diff_key($a2, $finalResult));
// Array ( [0001] => 2 [0002] => 2 [0003] => 3 [0004] => 8 [0005] => 10 [0006] => 12 [0007] => 7 )
解决方案是使用哈希表。不要使用对象列表,也可以使用
eId
作为键,这样您可以避免嵌套循环并仅查找键,例如:
$allKeys = array_unique( array_merge( array_keys($m1Array), array_keys($m2Array) ) );
foreach ($allKeys as $k) {
if (isset($m1Array[$k]) and isset($m2Array[$k]) ) {
// duplicate
}
}
无需过滤。 只需合并数组,并对分组/相关行的列值求和。 我更喜欢将引用推入结果数组中,因为这样可以避免在循环结束后需要重新索引结果数组。
第一次遇到给定的
eId
使用整行作为参考/分组行。 任何后续遭遇只会将 numVal
添加到组中的缓存值中。 演示
$result = [];
foreach (array_merge($array2, $array1) as $row) {
if (!isset($ref[$row['eId']])) {
$ref[$row['eId']] = $row;
$result[] =& $ref[$row['eId']];
continue;
}
$ref[$row['eId']]['numVal'] += $row['numVal'];
}
var_export($result);