0

我的帖子

个人中心

设置

  发新话题
复制内容到剪贴板
代码:
<?php
/*
*多维数组去重,根据变量值组合商品属性。
*数组字段:dim维度,dimName维度名称,sku(value商品属性,shopid商品id)
*假若,变量$shopid = 101;为当前商品id,则希望组合为
*1、所有的维度去重
*2、保留当前商品的颜色属性,就是说樱语粉的商品id是101,另外几个颜色任意保留其中一个。
*   下面两个维度,保留颜色是樱语粉的属性。
***----------------------------------***
**颜色 : 樱语粉(101)  珠光白  魅海蓝  流光金
**版本 : 64GB(101)    32GB(105)
**套装 :  官方标配(101)   特别版(102)
***----------------------------------***
*求大神帮忙解答!!!
*/
$arr = array(
    '1' => array(
        'dim' => 1,
        'dimName' => '颜色',
        'sku' => array(
                        '0' => Array('value' => '樱语粉','shopid' => 101),
                        '1' => Array('value' => '樱语粉','shopid' => 102),
                        '2' => Array('value' => '珠光白','shopid' => 103),
                        '3' => Array('value' => '魅海蓝','shopid' => 104),
                        '4' => Array('value' => '樱语粉','shopid' => 105),
                        '5' => Array('value' => '流光金','shopid' => 106),
                        '6' => Array('value' => '流光金','shopid' => 107),
                        '7' => Array('value' => '魅海蓝','shopid' => 108)      
        )
    ),
    '2' => Array(
                'dim' => 2,
                'dimName' => '版本',
                'sku' => Array(
                        '0' => Array('value' => '64GB','shopid' => 101),
                        '1' => Array('value' => '64GB','shopid' => 102),
                        '2' => Array('value' => '64GB','shopid' => 103),
                        '3' => Array('value' => '32GB','shopid' => 104),
                        '4' => Array('value' => '32GB','shopid' => 105),
                        '5' => Array('value' => '32GB','shopid' => 106),
                        '6' => Array('value' => '64GB','shopid' => 107),
                        '7' => Array('value' => '64GB','shopid' => 108)
                )

        ),

    '3' => Array(
                'dim' => 3,
                'dimName' => '套装',
                'sku' => Array(
                        '0' => Array('value' => '官方标配','shopid' => 101),
                        '1' => Array('value' => '特别版','shopid' => 102),
                        '2' => Array('value' => '官方标配','shopid' => 103),
                        '3' => Array('value' => '官方标配','shopid' => 104),
                        '4' => Array('value' => '官方标配','shopid' => 105),
                        '5' => Array('value' => '官方标配','shopid' => 106),
                        '6' => Array('value' => '官方标配','shopid' => 107),
                        '7' => Array('value' => '官方标配','shopid' => 108)
                )

        )
);
本帖最近评分记录
  • 七彩极 无忧币 +1 欢迎关注php版块~! 2017-11-25 15:30



本帖最后由 dewiyi 于 2017-11-25 17:39 编辑
我觉得是个很简单的问题,主要用一个函数就可以啦:array_unique()
删除重复值,返回剩余数组。但是没有看懂楼主的意思。。。麻烦举个简单的例子好吗? 用点通俗易懂的词语哈~~,不然我得靠猜~来领会你的问题……




本帖最后由 七彩极 于 2017-11-25 15:35 编辑
宝剑厉不厉害,要看它的主人是谁,不信来PHP版块看看~!
引用:
原帖由 七彩极 于 2017-11-25 15:30 发表
我觉得是个很简单的问题,主要用一个函数就可以啦:array_unique()
删除重复值,返回剩余数组。但是没有看懂楼主的意思。。。麻烦举个简单的例子好吗? 用点通俗易懂的词语哈~~,不然我得靠猜~来领会你的问题…… ...
这有八个商品,每个商品都有三个维度,颜色,版本和套装。
当前商品为101的时候,这三个维度都要有101这个商品的属性。


假如商品是107的话,三个维度都有107这个商品的属性。

效果就是京东的这个效果
地址是https://item.jd.com/3909936.html



你看我这样理解你的问题对不对:
1、所有的维度去重
达到的效果会是这样:
'0'=>Array('value'=>'樱语粉','shopid'=>101),
'2'=>Array('value'=>'珠光白','shopid'=>103),
'3'=>Array('value'=>'魅海蓝','shopid'=>104),
'5'=>Array('value'=>'流光金','shopid'=>106)

*2、保留当前商品的颜色属性,就是说樱语粉的商品id是101,另外几个颜色任意保留其中一个。
————这句话完全没看懂。

*   下面两个维度,保留颜色是樱语粉的属性。
你要把“樱语粉”的属性全部组合起来成这样吗?
'0'=>Array('value'=>'樱语粉','shopid'=>101,'sku' => Array('32GB','64GB','官方标配','特别版')
),



宝剑厉不厉害,要看它的主人是谁,不信来PHP版块看看~!
引用:
原帖由 七彩极 于 2017-11-25 20:03 发表
你看我这样理解你的问题对不对:
1、所有的维度去重
达到的效果会是这样:
'0'=>Array('value'=>'樱语粉','shopid'=>101),
'2'=>Array('value'=>'珠光白','shopid'=>103),
'3'=>Array('value'=>'魅海蓝','shopid'=>104), ...
不是要组合起来,还是要保留现在这个数组的结构。

这个数组是所有商品的数据,当选择一个商品进来的时候,肯定只要这一个商品的属性,对吧。既然这是所有商品的数据,显示的时候,肯定要只显示当前商品的属性对吧。

这样,去重的保留的什么都不要了,就只要当前商品的属性值,还是这个数组结构,大神,可以吗?



引用:
原帖由 dewiyi 于 2017-11-27 10:52 发表

不是要组合起来,还是要保留现在这个数组的结构。

这个数组是所有商品的数据,当选择一个商品进来的时候,肯定只要这一个商品的属性,对吧。既然这是所有商品的数据,显示的时候,肯定要只显示当前商品的属性对吧。

这样,去重 ...
也就是说,需要写一个函数,传一个ID参数,然后提取出这个ID所对应的颜色——再加上其他数组对应的所有属性,对吧?
如果是这样的话,从技术上其实不难,只是流程稍微复杂点。

大致思维过程我是这样的:

1.首先提取ID对应的颜色;
2.遍历颜色数组,提取这个颜色对应的所有ID(保存为数组 $ids);
3.遍历版本 和 套装数组,只提取相应的 $ids ;
4.检查版本 和 套装数组中是否有重复的value,如果有,则删除之。

OK




本帖最后由 七彩极 于 2017-11-27 15:39 编辑
宝剑厉不厉害,要看它的主人是谁,不信来PHP版块看看~!
这是我按照我的思路写出来的,楼主根据自己需要改造吧。。。

$color = getColor($arr['1']['sku'], 101);

$ids = getColorIDs($arr['1']['sku'],$color);

$versions = getValues($arr['2']['sku'],$ids);

$suits = getValues($arr['3']['sku'],$ids);

var_dump($ids, $versions, $suits);

//传入数组和指定ID,提取出这个ID对应的颜色
function getColor($arr,$id){
    foreach($arr as $one){
        if($one['shopid'] == $id) return $one['value'];
    }
    return false;
}

//返回这个颜色的其他ID
function getColorIDs($arr,$color){
    $ids = array();
    foreach($arr as $one){
        if($one['value'] == $color) $ids[] = $one['shopid'];
    }
    return $ids;
}

//提取版本和套装中的value
function getValues($arr,$ids){
    $array = array();
    $temp = array();
    foreach($arr as $one){
        if(in_array($one['shopid'],$ids)) $temp[$one['shopid']] = $one['value'];
    }
    $array = array_unique($temp);//去除重复版本
    return $array;
}


测试结果:



宝剑厉不厉害,要看它的主人是谁,不信来PHP版块看看~!
还是版主厉害,完全没看懂什么意思,话说这东西用E-R模型一做不是清清楚楚吗?



引用:
原帖由 lxpandsq 于 2017-11-27 16:53 发表
还是版主厉害,完全没看懂什么意思,话说这东西用E-R模型一做不是清清楚楚吗?
没学过高大上的“E-R模型”  不过,楼主实际的需求比普通的关联模型稍微复杂一点。方法多种多样,能够解决问题就行哈~!



宝剑厉不厉害,要看它的主人是谁,不信来PHP版块看看~!
引用:
原帖由 七彩极 于 2017-11-27 16:04 发表
这是我按照我的思路写出来的,楼主根据自己需要改造吧。。。

$color = getColor($arr['1']['sku'], 101);

$ids = getColorIDs($arr['1']['sku'],$color);

$versions = getValues($arr['2']['sku'],$ids);

$suits = ...
厉害了,版主!大神就是大神

多谢帮助!!



引用:
原帖由 lxpandsq 于 2017-11-27 16:53 发表
还是版主厉害,完全没看懂什么意思,话说这东西用E-R模型一做不是清清楚楚吗?
学习了!!



‹‹ 上一贴:【经验教程】给程序员的几条建议,精彩配图 ...   |   下一贴:【已解决】php一维数组去重,如何保留指定下标的数据? ... ››
  发新话题
快速回复主题
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 友情链接 |意见反馈 | 网站地图
Copyright©2005-2018 51CTO.COM
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系:bbs@51cto.com