我正在研究一个涉及产品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);
?>