这是我的数组:
[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)));
答案 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"
}
*/
我现在将相交保存在一个临时数组中,然后可以搜索该数组以找到最大的键。
然后,我使用此键获取[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"
}
*/
我重新编写了代码以使其更快。
我过去经常在后台使用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);
根据3v4l的说法,php 7.3.3中的代码快大约六倍