解析tpshop笛卡尔积

<?php


$arr  = array(         
            20 => array('7','8','9'),
            10=>array('1','2'),
            1 => array('3','4'),
            
        );

 foreach ($arr as $k => $v)//OSama:$spec_arr 是一个二维数组
        {
            $spec_arr_sort[$k] = count($v);//OSama:计算$(this).$v的个数;
//OSama:$spec_arr_sort=[ 20=>3,10=>2,1=>2 ] 
        }


asort($spec_arr_sort);
 //OSama:$spec_arr_sort = [ 1=>2,10=>2,20=>3 ];


 foreach ($spec_arr_sort as $key =>$val)//OSama:对升序后的数组进行组装 
        {
            $spec_arr2[$key] = $arr[$key];//OSama: $spec_arr2[]
//OSama: $spec_arr2 = [ 1=>['3','4'],10=>['1','2'],20=>['7','8','9']];
        }


 //OSama: $spec_arr2 = [ 1=>['3','4'],10=>['1','2'],20=>['7','8','9']];
$clo_name = array_keys($spec_arr2);  
$spec_arr2 = combineDika($spec_arr2);
/*
print_r($spec_arr2);exit;
*/




/**
 * 多个数组的笛卡尔积
*
* @param unknown_type $data
*/
function combineDika() {
$data = func_get_args();//Osama:func_get_args动态获取函数参数;动态的获取数组中的每个参数;
//OSama:  $data = array( '0'=> [ 1=>['3','4'],10=>['1','2'],20=>['7','8','9']]);
$data = current($data);//OSama:current() 函数返回数组中的当前元素的值。
//OSama: $data = [ 1=>['3','4'],10=>['1','2'],20=>['7','8','9']];
$cnt = count($data);//Osama:count() 函数返回数组中元素的数目。
//Osama:3
$result = array();
    $arr1 = array_shift($data);//OSama:array_shift() 函数删除数组中第一个元素,并返回被删除元素的值。
//OSama:$arr1 = [3,4];
foreach($arr1 as $key=>$item) 
{
$result[] = array($item);
}
    //Osama: $result [ 0=>[3],1=>[4]]
//OSama:$data = [[1,2],[7,8,9]];
foreach($data as $key=>$item) 
{                                
$result = combineArray($result,$item);
//OSama: 一轮轮完 [[3,1],[3,2],[4,1],[4,2]]
}
//print_r($result);exit;
return $result;

}


/**
 * 两个数组的笛卡尔积
 * @param unknown_type $arr1
 * @param unknown_type $arr2
*/
function combineArray($arr1,$arr2) {
    //Osama:一轮: $arr1=[ 0=>[3],1=>[4]]; $arr2 = [1,2];
//OSama:二轮:$arr1 = [[3,1],[3,2],[4,1],[4,2]]; $arr2 = [7,8,9];
$result = array();
foreach ($arr1 as $item1) 
{
foreach ($arr2 as $item2) 
{
$temp = $item1;//OSama: 1轮:3
$temp[] = $item2;//OSama: 1轮:[3,1] //在PHP里面,往数组中追加元素最简单的方法是使用[]赋值,
                 //https://zhidao.baidu.com/question/523460645.html
$result[] = $temp;//OSama: 1轮:[[3,1]]
}
//OSama: $arr2轮完: [[3,1],[3,2]]
}
//OSama:$arr1 轮完 [[3,1],[3,2],[4,1],[4,2]]
return $result;
}


/***********************************解析  func_num_args()  动态获取函数参数-[获取整个数组的参数]**********************/
/*
//$test = ['计','算','多','个','集','合','的','笛','卡','尔','积'];
foo('计','算','多','个','集','合','的','笛','卡','尔','积');
function foo(){
    $length = func_num_args();//获取数组的长度
    $args = func_get_args();
    for($i=0; $i<$length; $i++){
echo "第{$i}个参数值:{$args[$i]}<br />\n";
}
}




第0个参数值:计
第1个参数值:算
第2个参数值:多
第3个参数值:个
第4个参数值:集
第5个参数值:合
第6个参数值:的
第7个参数值:笛
第8个参数值:卡
第9个参数值:尔
第10个参数值:积
*/




/***********************************************解析current()方法  -- 降维函数****************************************/
//$temp = [[[2,3,4],[5],[6]]];


//$temp = current($temp);//降维函数
//print_r($temp);exit;//OSama:当数组为一维数组时[2,3,4],返回2
                    //OSama:当数组为一维数组时[[2,3,4],[5],[6]];,返回[2,3,4]




/***********************************************解析 $temp[] = 7  赋值*************************************************/
//$temp = [3,4];
//$temp[] = 7; //在PHP里面,往数组中追加元素最简单的方法是使用[]赋值,
//print_r($temp);exit;
//$temp = [3,4,7];



/***********************************************两个数组的笛卡尔积  -- [注意第一个数组的格式[[],[],[]]]*****************/
$arr = [];
$arr1 = [['a'],['b'],['c'],['d']];
$arr2 = [1,2,3,4];
   foreach($arr1 as $v1){
   foreach($arr2 as $v2){
   $temp = $v1;
   $temp[] = $v2;
   $arr[] = $temp;
   }
   }
print_r($arr);exit;   






 
/**
 * 计算多个集合的笛卡尔积
 * @param Array $sets 集合数组
 * @return Array
 */
 /*
function CartesianProduct($sets){
 
 // 保存结果
 $result = array();
 
 // 循环遍历集合数据
 for($i=0,$count=count($sets); $i<$count-1; $i++){
 
 // 初始化
 if($i==0){
  $result = $sets[$i];
 }
 
 // 保存临时数据
 $tmp = array();
 
 // 结果与下一个集合计算笛卡尔积
 foreach($result as $res){
  foreach($sets[$i+1] as $set){
  $tmp[] = $res.$set;
  }
 }
 
 // 将笛卡尔积写入结果
 $result = $tmp;
 
 }
 
 return $result;
 
}
 
// 定义集合
$sets = array(
 array('白色','黑色','红色'),
 array('透气','防滑'),
 array('37码','38码','39码'),
 array('男款','女款')
);
 
$result = CartesianProduct($sets);
print_r($result);
 
*/












?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值