首页 > 解决方案 > 合并3个数组,查找重复并比较价格,并以价格升序取最便宜的一个以及唯一值

问题描述

我想在 PHP 中运行一个脚本,我们需要在其中找到重复项并需要从不同的数组中保留最便宜的对。

我们有 3 个供应商(3 个数组),我们需要组合 3 个数组并找到重复项并从重复项中比较价格,并保持最便宜的一个不重复,并保持唯一数据,排序顺序价格上升。请找到以下案例。

注意:需要保持时间复杂度。

$supplier_1[] = array("sr" => "101", "model" => "iphone7", "color" => "silver", "price" => "52000");
$supplier_1[] = array("sr" => "102", "model" => "iphone7", "color" => "gold", "price" => "48000");
$supplier_1[] = array("sr" => "103", "model" => "iphone8", "color" => "red", "price" => "60000");
$supplier_1[] = array("sr" => "104", "model" => "iphoneXR", "color" => "silver", "price" => "72000");
$supplier_1[] = array("sr" => "105", "model" => "Galaxy10", "color" => "black", "price" => "63000");

$supplier_2[] = array("sr" => "201", "model" => "iphone7", "color" => "silver", "price" => "43000");
$supplier_2[] = array("sr" => "202", "model" => "iphone7", "color" => "gold", "price" => "62000");
$supplier_2[] = array("sr" => "203", "model" => "Xaiomi", "color" => "yellow", "price" => "12000");
$supplier_2[] = array("sr" => "204", "model" => "S10", "color" => "Grey", "price" => "80000");

$supplier_3[] = array("sr" => "301", "model" => "iphone7", "color" => "gold", "price" => "63000");
$supplier_3[] = array("sr" => "302", "model" => "iphone7", "color" => "silver", "price" => "48000");
$supplier_3[] = array("sr" => "303", "model" => "Xaiomi", "color" => "yellow", "price" => "18000");
$supplier_3[] = array("sr" => "304", "model" => "S10", "color" => "Grey", "price" => "60000");
$supplier_3[] = array("sr" => "305", "model" => "S12", "color" => "White", "price" => "59000");


// DESIRED RESULT

$result = array(
    "0" => array("sr" => "203", "model" => "Xaiomi", "color" => "yellow", "price" => "12000"),
    "1" => array("sr" => "201", "model" => "iphone7", "color" => "silver", "price" => "43000"),
    "2" => array("sr" => "102", "model" => "iphone7", "color" => "gold", "price" => "48000"),
    "3" => array("sr" => "305", "model" => "S12", "color" => "White", "price" => "59000"),
    "4" => array("sr" => "103", "model" => "iphone8", "color" => "red", "price" => "60000"),
    "5" => array("sr" => "304", "model" => "S10", "color" => "Grey", "price" => "60000"),
    "6" => array("sr" => "105", "model" => "Galaxy10", "color" => "black", "price" => "63000"),
    "7" => array("sr" => "104", "model" => "iphoneXR", "color" => "silver", "price" => "72000")
);

标签: phparraysarraylistmultidimensional-array

解决方案


这里的解决方案:

//merge 3 arays to one
$suppliers = array_merge($supplier_1, $supplier_2, $supplier_3);
$result = [];

foreach ($suppliers as $s) {
    $key = "{$s['model']}-{$s['color']}";
    if (!isset($result[$key]) || $result[$key]['price'] > $s['price']) {
        $result[$key] = $s;
    }
}

print_r(array_values($result));

PHP小提琴在这里

下面的MySQL解决方案:

select merged.*
from (
    select * from supplier_1
    union
    select * from supplier_2
    union
    select * from supplier_3
) merged
join (
  select model, color, min(price) min_price
  from (
      select * from supplier_1
      union
      select * from supplier_2
      union
      select * from supplier_3
  ) merged
  group by model, color
) groupped on 
    groupped.model = merged.model and
    groupped.color = merged.color and
    groupped.min_price = merged.price;

MySQL小提琴在这里


推荐阅读