在关联数组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);