/**
     * 获取 规格的 笛卡尔积
     * @param $goods_id 商品 id     
     * @param $spec_arr 笛卡尔积
     * @return string 返回表格字符串$goods_id, $spec_arr
     */ 

public function getSpecInput($goods_id, $spec_arr)

    {
        // <input name="item[2_4_7][price]" value="100" /><input name="item[2_4_7][name]" value="蓝色_S_长袖" />        
        // $goods_id = 18;
        // $spec_arr = array(         
        //     20 => array('7','8','9'),
        //     10=>array('1','2'),
        //     1 => array('3','4'),
            
        // );          
        // 排序
        foreach ($spec_arr as $k => $v)
        {
            $spec_arr_sort[$k] = count($v);
        }
        asort($spec_arr_sort);        
        foreach ($spec_arr_sort as $key =>$val)
        {
            $spec_arr2[$key] = $spec_arr[$key];
        }
     
        $clo_name = array_keys($spec_arr2);      
        $spec_arr2 = $this->combineDika($spec_arr2,3); //  获取 规格的 笛卡尔积                         
        $spec = $this->asArray(DB::table('spec')->select(['id','spec_name'])->get()); // 规格表id,name
        $spec = $this->array_change($spec);
        $specItem = $this->asArray(DB::table('spec_item')->select(['id','spec_id','item'])->get());//规格项id,item,spec_id
        $specItem = $this->array_change($specItem);
        $keySpecGoodsPrice = $this->asArray(DB::table('products')->select(['product_sn','price','sku','key_name','key','member_price'])->where('goods_id',$goods_id)->get());//规格项           
        $str = "<table class='table table-bordered' id='spec_input_tab'>";
        $str .="<tr>";      
       // 显示第一行的数据
       foreach ($clo_name as $k => $v)
       {
           $str .=" <td><b>{$spec[$v]['spec_name']}</b></td>";
       }    
        $str .="<td><b>价格</b></td>
                <td><b>会员价格</b></td>
                <td><b>团购价格</b></td>
                <td><b>库存</b></td>
             </tr>";
       // 显示第二行开始
       foreach ($spec_arr2 as $k => $v)
       {
            $str .="<tr>";
            $item_key_name = array();
            foreach($v as $k2 => $v2)
            {
                $str .="<td>{$specItem[$v2]['item']}</td>";
                $item_key_name[$v2] = $spec[$specItem[$v2]['spec_id']]['spec_name'].':'.$specItem[$v2]['item'];
            }  
            ksort($item_key_name);            
            $item_key = implode('_', array_keys($item_key_name));
            $item_name = implode(' ', $item_key_name);
            $product_sn = 'no_'.time().rand(11111,99999);
            $str .="<input type='hidden' name='item[$item_key][product_sn]' value='$product_sn'>";
            $str .="<td><input name='item[$item_key][price]' onkeyup='this.value=this.value.replace(/[^\d.]/g,\"\")' onpaste='this.value=this.value.replace(/[^\d.]/g,\"\")' /></td>";
            $str .="<td><input name='item[$item_key][member_price]' onkeyup='this.value=this.value.replace(/[^\d.]/g,\"\")' onpaste='this.value=this.value.replace(/[^\d.]/g,\"\")'/></td>";            
            $str .="<td><input name='item[$item_key][group_price]' onkeyup='this.value=this.value.replace(/[^\d.]/g,\"\")' onpaste='this.value=this.value.replace(/[^\d.]/g,\"\")'/></td>";
            $str .="<td><input name='item[$item_key][sku]'  />
                <input type='hidden' name='item[$item_key][key_name]' value='$item_name' /></td>";
            $str .="</tr>";           
       }
       $str .= "</table>";
       return $str;   
    }
    /**
     * 将id作为数组的键
     */
    public function array_change($arr,$id = 'id')
    {
        $newArr = [];
        foreach($arr as $k => $v){
            $newArr[$v[$id]] = $v;
        }
        return $newArr;
    }
    /**
     * 多个数组的笛卡尔积
    *
    * @param unknown_type $data
    */
    function combineDika() {
        $data = func_get_args();
        $data = current($data);
        $cnt = count($data);
        $result = array();
        $arr1 = array_shift($data);
        foreach($arr1 as $key=>$item)
        {
            $result[] = array($item);
        }       

        foreach($data as $key=>$item)
        {                                
            $result = $this->combineArray($result,$item);
        }
        return $result;
    }

    /**
     * 两个数组的笛卡尔积
     * @param unknown_type $arr1
     * @param unknown_type $arr2
    */
    function combineArray($arr1,$arr2) {         
        $result = array();
        foreach ($arr1 as $item1)
        {
            foreach ($arr2 as $item2)
            {
                $temp = $item1;
                $temp[] = $item2;
                $result[] = $temp;
            }
        }
        return $result;

    }

最终的效果图如下:

获取商品的笛卡尔积

相关文章: