在关联数组PHP中查找重复项,比较它们的值

时间:2019-03-18 09:33:16

标签: php arrays

这是我的数组:

[0] => Array
    (
        [0] => SupSKU
        [1] => MfrSKU
        [2] => Cost
    )

[1] => Array
    (
        [0] => A
        [1] => 11742-4
        [2] => 47.25
    )

[2] => Array
    (
        [0] => B
        [1] => 11742-4
        [2] => 283.5
    )

[3] => Array
    (
        [0] => C
        [1] => 0904101
        [2] => 995
    )

我想查找Mfrsku值中的重复值,在此示例中为11742-4,然后比较它们的价格,并保存更大的价格SupSku值。 所以我的输出将是

$final_output => Array ( 
  [0] => B
)

我尝试过这个,但这只会重新调整空数组

array_unique(array_diff_assoc($ar,array_unique($ar)));

1 个答案:

答案 0 :(得分:1)

这可能不是最佳性能,它比我想要的嵌套得更多。

我使用array_column和array_count_values来获取它们在数组中的次数,然后array_diff删除唯一值。
我循环复制这些副本,并找到与该副本相关联的最高价格,并将其保存在关联数组中。

$Mfr= array_column($arr, 1);
$dupes = array_diff(array_count_values($Mfr), [1]);

foreach($dupes as $key => $val){
    $res[$key] = max(array_intersect_key(array_column($arr, 2), array_intersect($Mfr, [$key])));
}

var_dump($res);
/*
array(1) {
  ["11742-4"]=>
  string(5) "283.5"
}
*/

https://3v4l.org/8v1Q0


我现在将相交保存在一个临时数组中,然后可以搜索该数组以找到最大的键。
然后,我使用此键获取[B]的[0]值。

$Mfr= array_column($arr, 1);
$dupes = array_diff(array_count_values($Mfr), [1]);

foreach($dupes as $key => $val){
    $temp = array_intersect_key(array_column($arr, 2), array_intersect($Mfr, [$key]));
    $res[$key] = $arr[array_search(max($temp), $temp)][0];

}

var_dump($res);
/*
array(1) {
  ["11742-4"]=>
  string(1) "B"
}
*/

https://3v4l.org/dSpBi


我重新编写了代码以使其更快。
我过去经常在后台使用array_intersect和array_column循环。
现在,此代码将执行更多的“前端”循环,而是创建一个快速操作的多维关联数组。

代码首先使用[MfrSKU] [SupSKU] = Cost创建一个新数组。
然后,我循环此数组,如果计数为1,则没有重复。

如果有重复项,则删除最小值并抓住键并将其保存到结果数组中。

foreach(array_slice($arr,1) as $sub){
    $new[$sub[1]][$sub[0]] = $sub[2];
}

foreach($new as $key => $sub){
    if(count($sub) == 1){ 
        continue;
    }
    $res[$key] = array_keys(array_diff($sub, [min($sub)]));
}

var_dump($res);

https://3v4l.org/20C2v

根据3v4l的说法,php 7.3.3中的代码快大约六倍