通过特定规则(php)查找给定集(数组)的子集

时间:2013-09-30 08:15:08

标签: php set subset

我有以下问题:

我有项目列表(数组),每个项目都属于类别。我有规则说两个类别中的哪一个可以组合在一起。我有方法get_rule_by_item(itemId1,itemId2),如果给定项目的类别可以组合在一起,则返回true,如果不能,则返回false。

因此,我需要编写PHP代码,通过提到的规则将项目数组分组到最佳匹配组中。

Array
(
    [tQVcIqz] => Array
        (
            [id] => tQVcIqz
            [data] => Array
                (
                    [orderId] => tQVcIqz
                    [createdOn] => 2013-09-30 01:44:46
                    [status] => nije placeno
                    [total] => 2631.00
                )

            [item_data] => Array
                (
                    [0] => Array
                        (
                            [name] => Item 1 - 1
                            [code] => ITEM1-123
                            [qty] => 1
                            [price] => 12
                        )

                    [1] => Array
                        (
                            [name] => Item 2 -2 
                            [code] => ITEM2-123
                            [qty] => 2
                            [price] => 123
                        )

                    [2] => Array
                        (
                            [name] => Item 3 - 3
                            [code] => ITEM3-123
                            [qty] => 3
                            [price] => 12
                        )

                    [3] => Array
                        (
                            [name] => Item 4 - 4
                            [code] => ITEM4-4
                            [qty] => 4
                            [price] => 123
                        )

                    [4] => Array
                        (
                            [name] => Item 5 - 5
                            [code] => ITEM5-123
                            [qty] => 5
                            [price] => 123
                        )

                )

        )

)

这是输入数组...项数据是需要在不同子集中拆分的数组...例如,这里的规则集是这样的:

item1 item2 rule
 1      2     1
 1      3     0 
 1      4     1 
 1      5     1
 4      5     0

其中规则是1 - 如果他们可以一起去0而他们不能......

项目的ID从1开始,只是数组中的索引从0开始......

1 个答案:

答案 0 :(得分:0)

function group_ok($code, $group) {
    if (!is_array($group)) return TRUE;
    foreach($group as $item){
        if ($this->get_rules_items($code, $item) === FALSE) return FALSE;}
    return TRUE;
}

function remove($arr,$val){
    if(($key = array_search($val, $arr)) !== false) {
        unset($arr[$key]);
    }
    return $arr;
}


function get_user_orders(){
    $userId = $this->tank_auth->get_user_id();

    $res = $this->shop->get_orders_by_user($userId);

    foreach($res as $key => $val){
        $it = array();
        foreach($val['item_data'] as $items) $it[] = $items['id'];
    }

    $k=0;
    $group = array();

    while(sizeof($it)>0){
        foreach($it as $item){

            if($this->group_ok($item,$group[$k])){
                $group[$k][] = $item;
                $it = $this->remove($it,$item);

            }
        }

        $k++;
    }

假设$ res获得了我在队列中发布的数组 - >这是解决方案。在我提出问题后2小时把它写下来,只需要考虑一下......感谢所有人......如果问题不合适就很抱歉......为了投票,精英主义的混蛋做到了......