笛卡尔乘积

笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。
方式一:
<?php
    // 笛卡尔积
    $color = array('red', 'green');
    $size  = array(39, 40, 41);
    $local = array('M', 'L');
    
    echo "<pre>";
    print_r(combineDika($color, $size));
    print_r(combineDika($color, $size, $local));
    
    /**
     * 所有数组的笛卡尔积
     */
    function combineDika() 
    {       
        $data   = func_get_args(); // 获取所有数据
        $cnt    = count($data);    // 计算总数(用于循环)
        $result = array();         // 结果数组

        // 取出第一个元素遍历为二维数组
        foreach($data[0] as $item) {
            $result[] = array($item);
        }
        // return [$data, $result];
        // 从第二元素开始循环
        for($i = 1; $i < $cnt; $i++) {
            $result = combineArray($result, $data[$i]); // 循环匹配
        }
        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;
    }

  方式二:

<?Php
    $arr = array(
        array(1,3,4,5),
        array(3,5,7,9),
        array(76,6,1,0)
    );

    /**
    ** 实现二维数组的笛卡尔积组合
    ** $arr 要进行笛卡尔积的二维数组
    ** $str 最终实现的笛卡尔积组合,可不写
    ** @return array
    **/
    function cartesian($arr, $str = array())
    {
        //去除第一个元素
        $first = array_shift($arr);
        //判断是否是第一次进行拼接
        if(count($str) > 1) {
            foreach ($str as $k => $val) {
                foreach ($first as $key => $value) {
                    // 最终实现的格式 1,3,76
                    // 可根据具体需求进行变更
                    $str2[] = $val.','.$value;
                }
            }

        } else {

            foreach ($first as $key => $value) {
                
                //最终实现的格式 1,3,76
                //可根据具体需求进行变更
                $str2[] = $value;
            }
        }

        //递归进行拼接
        if(count($arr) > 0) {
            $str2 = cartesian($arr, $str2);
        }
        //返回最终笛卡尔积
        return $str2;
    }

    $cartesian_product = cartesian($arr);
    echo '<pre>';
    print_r($cartesian_product);

  

posted @ 2020-06-14 10:42  Towering~  阅读(562)  评论(0编辑  收藏  举报