求 组合数据的筛选方法

ywq0127 2014-02-24 06:56:26
像淘宝的商品一样,有N个商品属性,可以进行选择,查看是否可以购买:

1. 假设有四组属性:
颜色: 红,绿,蓝
大小: 1m,2m,3m
质地: 皮,棉
款式: 款式1,款式2
2. 这样就总共有3*3*2*2=36种类型的商品,商品通过库存控制是否可购买
3. 现在页面上要实现:勾选颜色,能筛选出哪些属性还可以勾选。勾选任意组合属性能查询出还可以勾选的其他属性或者不能勾选的属性

尝试过:
1. 通过勾选的属性,完整的去筛选已有的类型
2. 通过勾选的属性,分别去筛选已有的类型,最后在合并筛选结果

上面两种方式都得不到想要的结果,要疯了。。。
...全文
233 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yunfeifan 2014-02-25
  • 打赏
  • 举报
回复

$size = [1,2,3,4,5];
$color = [a,b,c];
$stru = [x, y];

$result = array();
$result[1_a_x] = 15;
$result[2_a_x] = 10;
$result[3_a_y] = 12;

function fun($cur, $pos, $result) {
  return ;// 通过传进来的cur 和a 来返回相应的值,
  //例如传了a,1,则取出来是[0] = [1,2,3],[2] => [x,y]
  // 最简单(效率不高)的办法是遍历拿到result key 根据$pos 取出来相应的位置,然后算出来其他两列的值。
} 



xuzuning 2014-02-25
  • 打赏
  • 举报
回复
在此基础上,你可以方便的进行扩展
xuzuning 2014-02-25
  • 打赏
  • 举报
回复
不太清楚你打算得到怎样的结果 假定你的数组为 $dict,则有
$_GET = array('c' => '红', 't' => '皮', 's' => '2m');

print_r(find($dict));

function find(&$ar) {
  $res = array();
  foreach($ar as $k=>$item) {
    if($_GET == array_intersect_assoc($_GET, $item['specs'])) {
      if($item['num']) $res[] = $k;
    }
  }
  return $res;
}
Array ( [0] => 红_2m_皮_款式2 )
ywq0127 2014-02-25
  • 打赏
  • 举报
回复
我觉得我的思维进入了误区。。。好像进入了死胡同,出不来了
wang8223538 2014-02-25
  • 打赏
  • 举报
回复
我做过这种筛选,但是方法比较笨。 建一个数组保存要要筛选的值,用来进行下次添加条件时,组装sql语句,再建一个数组保存已经筛选的属性,红色框就相当于表示已经筛选的属性。
ywq0127 2014-02-25
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
请给出测试数据
8楼有了
ywq0127 2014-02-25
  • 打赏
  • 举报
回复
引用 3 楼 aazbc 的回复:
感觉通过数据库中商品字段信息可以查询呀
引用 5 楼 yunfeifan 的回复:
这个在勾选了颜色的时候 提交后台数据查询。例如 color=红 把查询结果表现在点击的按钮上边,然后如果用户再勾选一个,则后台查询 colore=红 and size=1 把查询的结果表现在按钮上 不就可以了

$specs = array(
    'c' => '颜色',
    's' => '大小',
    't' => '质地',
    'm' => '款式',
);
$combi = Array
(
    [红_1m_皮_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 红
                    [s] => 1m
                    [t] => 皮
                    [m] => 款式1
                )

            [num] => 0
        )

    [红_1m_皮_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 红
                    [s] => 1m
                    [t] => 皮
                    [m] => 款式2
                )

            [num] => 0
        )

    [红_1m_棉_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 红
                    [s] => 1m
                    [t] => 棉
                    [m] => 款式1
                )

            [num] => 0
        )

    [红_1m_棉_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 红
                    [s] => 1m
                    [t] => 棉
                    [m] => 款式2
                )

            [num] => 1
        )

    [红_2m_皮_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 红
                    [s] => 2m
                    [t] => 皮
                    [m] => 款式1
                )

            [num] => 0
        )

    [红_2m_皮_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 红
                    [s] => 2m
                    [t] => 皮
                    [m] => 款式2
                )

            [num] => 1
        )

    [红_2m_棉_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 红
                    [s] => 2m
                    [t] => 棉
                    [m] => 款式1
                )

            [num] => 0
        )

    [红_2m_棉_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 红
                    [s] => 2m
                    [t] => 棉
                    [m] => 款式2
                )

            [num] => 0
        )

    [红_3m_皮_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 红
                    [s] => 3m
                    [t] => 皮
                    [m] => 款式1
                )

            [num] => 0
        )

    [红_3m_皮_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 红
                    [s] => 3m
                    [t] => 皮
                    [m] => 款式2
                )

            [num] => 1
        )

    [红_3m_棉_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 红
                    [s] => 3m
                    [t] => 棉
                    [m] => 款式1
                )

            [num] => 1
        )

    [红_3m_棉_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 红
                    [s] => 3m
                    [t] => 棉
                    [m] => 款式2
                )

            [num] => 0
        )

    [绿_1m_皮_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 绿
                    [s] => 1m
                    [t] => 皮
                    [m] => 款式1
                )

            [num] => 0
        )

    [绿_1m_皮_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 绿
                    [s] => 1m
                    [t] => 皮
                    [m] => 款式2
                )

            [num] => 1
        )

    [绿_1m_棉_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 绿
                    [s] => 1m
                    [t] => 棉
                    [m] => 款式1
                )

            [num] => 1
        )

    [绿_1m_棉_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 绿
                    [s] => 1m
                    [t] => 棉
                    [m] => 款式2
                )

            [num] => 0
        )

    [绿_2m_皮_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 绿
                    [s] => 2m
                    [t] => 皮
                    [m] => 款式1
                )

            [num] => 0
        )

    [绿_2m_皮_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 绿
                    [s] => 2m
                    [t] => 皮
                    [m] => 款式2
                )

            [num] => 1
        )

    [绿_2m_棉_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 绿
                    [s] => 2m
                    [t] => 棉
                    [m] => 款式1
                )

            [num] => 1
        )

    [绿_2m_棉_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 绿
                    [s] => 2m
                    [t] => 棉
                    [m] => 款式2
                )

            [num] => 1
        )

    [绿_3m_皮_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 绿
                    [s] => 3m
                    [t] => 皮
                    [m] => 款式1
                )

            [num] => 0
        )

    [绿_3m_皮_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 绿
                    [s] => 3m
                    [t] => 皮
                    [m] => 款式2
                )

            [num] => 0
        )

    [绿_3m_棉_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 绿
                    [s] => 3m
                    [t] => 棉
                    [m] => 款式1
                )

            [num] => 1
        )

    [绿_3m_棉_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 绿
                    [s] => 3m
                    [t] => 棉
                    [m] => 款式2
                )

            [num] => 0
        )

    [蓝_1m_皮_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 蓝
                    [s] => 1m
                    [t] => 皮
                    [m] => 款式1
                )

            [num] => 0
        )

    [蓝_1m_皮_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 蓝
                    [s] => 1m
                    [t] => 皮
                    [m] => 款式2
                )

            [num] => 1
        )

    [蓝_1m_棉_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 蓝
                    [s] => 1m
                    [t] => 棉
                    [m] => 款式1
                )

            [num] => 1
        )

    [蓝_1m_棉_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 蓝
                    [s] => 1m
                    [t] => 棉
                    [m] => 款式2
                )

            [num] => 0
        )

    [蓝_2m_皮_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 蓝
                    [s] => 2m
                    [t] => 皮
                    [m] => 款式1
                )

            [num] => 1
        )

    [蓝_2m_皮_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 蓝
                    [s] => 2m
                    [t] => 皮
                    [m] => 款式2
                )

            [num] => 0
        )

    [蓝_2m_棉_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 蓝
                    [s] => 2m
                    [t] => 棉
                    [m] => 款式1
                )

            [num] => 0
        )

    [蓝_2m_棉_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 蓝
                    [s] => 2m
                    [t] => 棉
                    [m] => 款式2
                )

            [num] => 1
        )

    [蓝_3m_皮_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 蓝
                    [s] => 3m
                    [t] => 皮
                    [m] => 款式1
                )

            [num] => 0
        )

    [蓝_3m_皮_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 蓝
                    [s] => 3m
                    [t] => 皮
                    [m] => 款式2
                )

            [num] => 0
        )

    [蓝_3m_棉_款式1] => Array
        (
            [specs] => Array
                (
                    [c] => 蓝
                    [s] => 3m
                    [t] => 棉
                    [m] => 款式1
                )

            [num] => 1
        )

    [蓝_3m_棉_款式2] => Array
        (
            [specs] => Array
                (
                    [c] => 蓝
                    [s] => 3m
                    [t] => 棉
                    [m] => 款式2
                )

            [num] => 0
        )

)
可以从这个结果集中进行多次筛选看看
xuzuning 2014-02-25
  • 打赏
  • 举报
回复
请给出测试数据
ywq0127 2014-02-25
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
需要知道你是怎么做的!
像淘宝的商品一样,四个属性分类显示,可以分别选中各个属性中的一个进行检测其他还可以选择的属性值。 我现在有一个数组,包含了所有的组合情况。前面尝试的两种方式,假设选中了一个颜色,一个大小: 1. 通过选中的颜色和大小去组合数组中查找符合这两项的数据,检查出可以勾选的属性值 2. 先通过颜色去数组中查找可选和不可选的属性值,再通过大小去数组中查找(不改变数组的内容),最后在合并两次查找到的结果。合并过程:两次查找的可选数据如果都存在则取交集,不存在则取并集;两次查找的不可选数据如果都存在则取交集,不存在则取并集,最后再去掉属性存在可选集合中的数据得到不可选集
yunfeifan 2014-02-25
  • 打赏
  • 举报
回复
这个在勾选了颜色的时候 提交后台数据查询。例如 color=红 把查询结果表现在点击的按钮上边,然后如果用户再勾选一个,则后台查询 colore=红 and size=1 把查询的结果表现在按钮上 不就可以了
tottyandbaty 2014-02-25
  • 打赏
  • 举报
回复
这个你可以查看ecshop的做法.
ywq0127 2014-02-25
  • 打赏
  • 举报
回复
楼上最后一张图有点问题:2m不是选中状态
ywq0127 2014-02-25
  • 打赏
  • 举报
回复
引用 12 楼 xuzuning 的回复:
不太清楚你打算得到怎样的结果
假定你的数组为 $dict,则有
$_GET = array('c' => '红', 't' => '皮', 's' => '2m');

print_r(find($dict));

function find(&$ar) {
$res = array();
foreach($ar as $k=>$item) {
if($_GET == array_intersect_assoc($_GET, $item['specs'])) {
if($item['num']) $res[] = $k;
}
}
return $res;
}
Array
(
[0] => 红_2m_皮_款式2
)


根据#8的数组$combi,可选择的商品有:
红/1m/棉/款式2
红/2m/皮/款式2
红/3m/皮/款式2
红/3m/棉/款式1
绿/1m/皮/款式2
绿/1m/棉/款式1
绿/2m/皮/款式2
绿/2m/棉/款式1
绿/2m/棉/款式2
绿/3m/棉/款式1
蓝/1m/皮/款式2
蓝/1m/棉/款式1
蓝/2m/皮/款式1
蓝/2m/棉/款式2
蓝/3m/棉/款式1
选择界面:

进行选择:
1. 选择了 红色时效果:

2. 选择了 红色,2m时效果:

3. 选择了 红色,棉时效果:

4. 选择了 红色,棉,3m时效果:

5. 选择了 红色,皮时效果:

6. 选择了 红色,皮,3m时效果:

7. 选择了 红色,皮,3m,款式2时效果:


不知道描述清楚了没有,脑袋要成浆糊了。。
野树林 2014-02-24
  • 打赏
  • 举报
回复
感觉通过数据库中商品字段信息可以查询呀
xuzuning 2014-02-24
  • 打赏
  • 举报
回复
需要知道你是怎么做的!
ywq0127 2014-02-24
  • 打赏
  • 举报
回复
考虑到页面上操作的时候,可能会有各种重复筛选的动作,所以筛选出来的数据必须要能完整描述当前可选的属性

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧