Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在关联数组PHP中查找重复项,比较它们的值_Php_Arrays - Fatal编程技术网

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

在关联数组PHP中查找重复项,比较它们的值,php,arrays,Php,Arrays,这是我的阵列: [0] => Array ( [0] => SupSKU [1] => MfrSKU [2] => Cost ) [1] => Array ( [0] => A [1] => 11742-4 [2] => 47.25 ) [2] => Array ( [0] => B

这是我的阵列:

[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)));

这可能不是最好的性能,它得到了比我想要的更多的嵌套

我使用array\u column和array\u count\u值获取它们在数组中的次数,然后array\u 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"
}
*/


现在,我将intersect保存在一个临时数组中,然后可以搜索该数组,以查找哪个键具有最大值。
然后,我使用该键获取[0]值,即“B”


我重新编写了代码以加快速度。
我以前在背景中使用了很多循环,包括array_intersect和array_column。
这段代码现在将执行更多的循环“前端”,而是创建一个多维关联数组,可以快速操作

代码首先创建一个新数组,其[MfrSKU][SupSKU]=成本。
然后我循环这个数组,如果计数是一,那么就没有重复的

如果存在重复项,我将移除最小值并抓取键并将它们保存到结果数组中

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


根据3v4l,php 7.3.3中的代码速度大约快了六倍

请注意,OP请求输出SupSKU,其中的最高价格是最高价格,而不是最高价格本身(他可以再次循环执行,但最好提供一种包含此内容的方法),但这不是我需要的输出?哦。。。我错过了。让我尝试修复它。如何将其转换为[0]=>“B”请尝试代码。代码完全符合您的要求。您可以单击链接并对其进行测试,或者只查看注释掉的输出。
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);