【问题标题】:Combine 3 arrays, find duplicates and compare price and take the cheapest one as well as unique value with price ascending order合并3个数组,查找重复并比较价格,并以价格升序取最便宜的一个以及唯一值
【发布时间】:2021-04-12 04:48:11
【问题描述】:

我想在 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")
);

【问题讨论】:

  • 这和mysql有什么关系???
  • @scaisEdge 因为我们正在从 3 个不同的表中检索数据库中的数据
  • 所以你可以在 MySQL 端完成这项工作
  • @SlavaRozhnev 你能告诉我如何通过在一个查询中加入 3 个表来比较和找到去重和唯一和最便宜的值。
  • 更新您的问题添加相关表架构和您用于填充数组的查询..

标签: php arrays arraylist multidimensional-array


【解决方案1】:

解决办法:

//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 fiddle here

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 fiddle here

【讨论】:

    猜你喜欢
    • 2012-05-22
    • 2021-05-24
    • 1970-01-01
    • 2013-10-11
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    相关资源
    最近更新 更多