PHP - 组合两个数组并将供应商id1映射到供应商id2

问题描述 投票:0回答:1

我正在研究一个涉及产品ID组合和映射的数组。

我有两个供应商对同一产品具有相同的ID,具有不同的价格和特定ID的略有不同的名称。我想只显示供应商,只要两个数组具有相同的产品ID,就会为我提供特定ID(产品)的最优价格。我希望显示每个可用的产品,只消除重复,只显示价格最优的产品。

我的代码有问题,无法弄清楚如何做到这一点。

以下是我的代码。请注意我为供应商1和供应商2制作了一个数组,而不是从我的数据库中提取它;所以你们可以将它复制到你的IDE进行调试。

<?php 
//array for supplier 1 data
$combined_sup1=array(
               array('id'=>71,'product'=>'Irish Spring Deodorant Soap - 8ct','price'=>3.99, 'img'=>'images/71.jpg'),
               array('id'=>14,'product'=>'L.A. Looks Sport Styling Gel 8 Oz','price'=>2.78, 'img'=>'images/14.jpg'),
               array('id'=>43,'product'=>'Cetaphil Daily Facial Cleanser - 8 fl oz bottle','price'=>8.89, 'img'=>'images/43.jpg'));
// array for supplier 2 data
$combined_sup2=array(
               array('id'=>21,'product'=>'Head and Shoulders- Dandruff Shampoo, 13.5 fl oz','price'=>5.94, 'img'=>'images/21.jpg'),
               array('id'=>71,'product'=>'Irish Spring Soap - 8ct','price'=>3.39, 'img'=>'images/71.jpg'),
               array('id'=>12,'product'=>'Colgate Total Toothpaste Advanced Whitening - 4 oz','price'=>3.59, 'img'=>'images/12.jpg'),
               array('id'=>43,'product'=>'Cetaphil Daily Facial Cleanser - 8 fl oz bottle','price'=>7.99, 'img'=>'images/43.jpg'));

//$merge=array_merge($combined_sup1,$combined_sup2);
     //  now to combine both arrays
     $combined_suppliers = array();
     // foreach($merge as $c){
    foreach ($combined_sup1 as $sup1 ) {   //  first loop supplier 1

        $comb = array('id_sup1' => $sup1['id'],'product' => $sup1['product'],'price_sup1'=>$sup1['price'],'img'=>$sup1['img']);  


        foreach ($combined_sup2 as $sup2) {   //  second loop supplier 2

            if ($sup2['id'] == $sup1['id']) {     //  if supplier 1 id =  supplier 2 id

                $comb["idsup2"]= $sup2['id'];
                $comb["product"]= $sup2['product'];
                $comb["price_sup2"]= $sup2['price'];
                $comb["img"]= $sup2['img'];
                break;
            }

        }  // end second loop



    $combined_suppliers[] = $comb;

}  // END //  first loop

// } //  end merge loop

// print_r($combined_sup1);
// print_r($combined_sup2);
// print_r($merge);

print_r($combined_suppliers);



?>

更新以下是Wilhelm建议的工作代码。

<?php 
//array for supplier 1 data
$combined_sup1=array(
               array('id'=>71,'product'=>'Irish Spring Deodorant Soap - 8ct','price'=>3.99, 'img'=>'images/71.jpg'),
               array('id'=>14,'product'=>'L.A. Looks Sport Styling Gel 8 Oz','price'=>2.78, 'img'=>'images/14.jpg'),
               array('id'=>43,'product'=>'Cetaphil Daily Facial Cleanser - 8 fl oz bottle','price'=>8.89, 'img'=>'images/43.jpg'));
// array for supplier 2 data
$combined_sup2=array(
               array('id'=>21,'product'=>'Head and Shoulders- Dandruff Shampoo, 13.5 fl oz','price'=>5.94, 'img'=>'images/21.jpg'),
               array('id'=>71,'product'=>'Irish Spring Soap - 8ct','price'=>3.39, 'img'=>'images/71.jpg'),
               array('id'=>12,'product'=>'Colgate Total Toothpaste Advanced Whitening - 4 oz','price'=>3.59, 'img'=>'images/12.jpg'),
               array('id'=>43,'product'=>'Cetaphil Daily Facial Cleanser - 8 fl oz bottle','price'=>7.99, 'img'=>'images/43.jpg'));


//merge both arrays of products into one array
$comb = array_merge($combined_sup2,$combined_sup1);
//make new clear array for results
$listed = [];
//iterate over each product
foreach ($comb as $item) {
//if product with same id is in result array, then...
if(array_key_exists($item['id'], $listed)){
    //compare their prices
    if($listed[$item['id']]['price'] > $item['price']){
        //if price is lower than listed one, replace it
        $listed[$item['id']] = $item;
    }
} else {
    //there is no product with this id, so add it.
    $listed[$item['id']] = $item;
}
}


// print_r($combined_sup1);
// print_r($combined_sup2);
// print_r($merge);

print_r($listed);



?>
php arrays
1个回答
2
投票

尝试这样的事情。

//merge both arrays of products into one array
$comb = array_merge($combined_sup2, $combined_sup1);
//make new clear array for results
$listed = [];
//iterate over each product
foreach ($comb as $item) {
    //if product with same id is in result array, then...
    if(array_key_exists($item['id'], $listed)){
        //compare their prices
        if($listed[$item['id']]['price'] > $item['price']){
            //if price is lower than listed one, replace it
            $listed[$item['id']] = $item;
        }
    } else {
        //there is no product with this id, so add it.
        $listed[$item['id']] = $item;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.