【问题标题】:Compare values between two multidimensional arrays in PHP在 PHP 中比较两个多维数组之间的值
【发布时间】:2018-03-19 09:23:31
【问题描述】:

我有下面的 PHP 代码将检查两个关联数组。我的问题是,这段代码执行了很多循环,我不希望它影响我的应用程序的性能。 PHP中是否有任何方法或功能可以自动检测重复?结果和我的一样。

请查看示例here。

这是我的代码:

// 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();


//[seond 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 在另一个数组中有重复项,则在将其添加到我的 output 或 finalResult array 之前添加它们对应的 numVal。但是如果没有重复的话直接发到我的finalResult array。

我附上了一张表格图,说明它是如何工作的。希望这可以帮助。谢谢。

【问题讨论】:

  • 这看起来像是stackoverflow.com/questions/6086267/…的副本
  • 不,不是。 Co'z 在我的情况下,我不是在寻找重复的键。我正在寻找我的eId 键中的重复值并添加numVal 键的值。但是,也许这会对我有所帮助。我将尝试检查一些建议并尝试将其应用到我的代码中。谢谢。
  • 所以当值匹配时——你把它相加。那不匹配的时候怎么办?
  • 如图所示,它将直接转到我的finalResult 数组。顺便说一句,@Aniket 已经给了我更短的代码。我认为这就是我正在寻找的代码。我只是想让我的代码更短更干净。非常感谢您抽出宝贵时间@sevavietl。我很感激!

标签: php arrays duplicates


【解决方案1】:

您可以通过使用array_udiff() 将59 代码行减少为3 以获得两个多维数组之间的差异。它接受一个用于数据比较的函数:

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 )

【讨论】:

  • 你好@Aniket。感谢您的回答,但我认为array_udiff() 只会删除重复的项目。我在上面编辑了我的问题,以便更清楚。希望有帮助。谢谢!
  • @Jun 没有直接的替代方案。我已根据您的需要编辑了答案,您可以根据需要重新排列值。
  • 这正是我要找的!!! :) 非常感谢@Aniket。感谢您的时间!
  • @Jun 很高兴为您提供帮助 :)
【解决方案2】:

解决方案是使用哈希表。除了使用对象列表之外,还可以使用 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
   }  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    相关资源
    最近更新 更多