代码之家  ›  专栏  ›  技术社区  ›  Logical Nonsense

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

  •  0
  • Logical Nonsense  · 技术社区  · 7 年前

    我正在研究一个涉及产品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);
    
    
    
    ?>
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Wilhelm Schmidtmayer    7 年前

    试试这样的。

    //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;
        }
    }