【发布时间】:2014-08-03 05:23:16
【问题描述】:
我在不同的商店中有一系列设备(ibm、sony、dell)(以简化商店 1、2、3)。我要做的是创建一个拥有所有产品的商店的比较。在下面的示例中,唯一符合条件的商店是 shop_id: 2(商店 1 没有戴尔,商店 3 没有出售 ibm)。
例子:
[
[ {"id": "1", "name": "ibm", "price": "22", "shop_id": "1"}, {"id": "2", "name": "ibm", "price": "27", "shop_id": "1"}, {"id": "3", "name": "ibm", "price": "21", "shop_id":" 2"} ],
[ {"id": "4", "name": "sony", "price": "19", "shop_id": "1"}, {"id": "5", "name": "sony", "price": "21", "shop_id": "2"}, {"id": "6", "name": "sony", "price": "28", "shop_id": "3"} ],
[ {"id": "7", "name": "dell", "price": "22", "shop_id": "2"}, {"id": "8", "name": "dell", "price": "27", "shop_id": "2"}, {"id": "9", "name": "dell", "price": "21", "shop_id": "3"} ]
]
必须转换为:
[
[ {"id": "3", "name": "ibm", "price": "21", "shop_id": "2"}, {"id": "5", "name": "sony", "price": "21", "shop_id": "2"}, {"id": "7", "name": "dell", "price": "22", "shop_id": "2"}],
[ {"id": "3", "name": "ibm", "price": "21", "shop_id": "2"}, {"id": "5", "name": "sony", "price": "21", "shop_id": "2"}, {"id": "8", "name": "dell", "price": "27", "shop_id": "2"}]
]
我必须用 PHP 来做,但我只需要一个算法来解决这个问题。 有无限数量的设备 - 目前只有 3 家商店,但可能更多,所以假设它也是无限的。
到目前为止,我几乎可以使用...但是当一家商店中的设备交易超过一笔时,它就会中断(它只获得第一笔交易)。
public function getDeals($prices){
// define return array
$multi_deals = array();
// get number of devices
$no_devices = count($prices);
// loop over each deal for first device
foreach ($prices[0] as $dd){
// reset other arrays
for ($j=1; $j<$no_devices; $j++)
reset($prices[$j]);
// remember deal shop
$shop = $dd['shop_id'];
$success = true;
$i=0;
// remember deal
$multi_deal = array();
$multi_deal[$i] = $dd;
// loop over rest of the devices
while ($i < ($no_devices-1)){
$i++;
// only continue if found a deal from the same shop
if ( !($multi_deal[$i] = self::getDevice($shop, $prices[$i]))){
$success = false;
break;
}
// THIS IS WHERE PRICES ARRAY WILL BE RESET IF THE SAME DEVICE IS TWICE IN ONE SHOP
}
// we looped over all devices and find deals for each one of them
if ($success)
$multi_deals[] = $multi_deal;
}
}
public function getDevice($current_shop, &$deals){
while ($deal = next($deals)){
if ($deal['shop_id'] == $current_shop)
return $deal;
}
return false;
}
我现在花了几个小时来解决这个问题,所以我会很感激任何线索。
更新:
假设您有供应商(商店)销售产品(ibm、sony、dell)。作为客户,我想购买 1*ibm + 1*sony + 1*dell,而且必须来自一家商店。
作为结果,我需要显示可能交易的完整列表,按商店划分
在我给出的示例中,只有一家商店拥有所有免费产品 - shop_id: 2。 更重要的是这家商店有2个戴尔优惠。这就是为什么我们有两个结果集,因为有两种可能的组合。
更新 2:
我尝试了不同的方法,我想我越来越接近了。我已经到了我有的地步
[
{ "shop_id": "2", "deals": [
{ "ibm": [
{"id": "3", "name": "ibm", "price": "21", "shop_id":" 2"}
] },
{ "sony": [
{"id": "5", "name": "sony", "price": "21", "shop_id": "2"}
] },
{ "dell": [
{"id": "7", "name": "dell", "price": "22", "shop_id": "2"},
{"id": "8", "name": "dell", "price": "27", "shop_id": "2"}
] }
] }
]
又要转换成:
[
[ {"id": "3", "name": "ibm", "price": "21", "shop_id": "2"}, {"id": "5", "name": "sony", "price": "21", "shop_id": "2"}, {"id": "7", "name": "dell", "price": "22", "shop_id": "2"}],
[ {"id": "3", "name": "ibm", "price": "21", "shop_id": "2"}, {"id": "5", "name": "sony", "price": "21", "shop_id": "2"}, {"id": "8", "name": "dell", "price": "27", "shop_id": "2"}]
]
【问题讨论】:
-
请澄清您的意思是“创建一个拥有所有产品的商店的比较”。在您的示例中,输入中有一个元素
{id: 3, name: 'ibm', price: 21, shop_id: 2},但输出中有两个这样的元素.. -
我真诚地为示例添加了有效的 JSON,因为这听起来是一个有趣的问题。但我有点不清楚输出应该是什么。
-
@kevinabelita 交易必须按商店拆分。如果您查看我的示例输出仅来自 shop: 2 的结果(商店 1 没有戴尔,商店 3 没有 ibm)。
标签: php arrays transformation