第2弹在
http://topic.csdn.net/u/20110531/17/dd79391a-ed60-4050-b741-409cf1cbe6d2.html
不过问题比我想象的复杂以本人现在肤浅的水平显然无法从第二弹获得灵感。只好再出第三弹问题,有感于各位高手在此孜孜不倦的答复问题,此问题真金白银感谢。感谢金额=悬赏分数+50,虽然不多,但是代表本人的感激之情.最后结果本人将在此贴回复.只要最后函数得到的结果是本人需要的,那么本人将通过支付宝表达本人的谢意,咔咔...
=================
这个是标准,下面问题描述可能没有你自己看这个截图来得准确.
这里是从js 截图的运算结果
=================
问题描述有如下数据31,42...更多
32
43
35
36
...
更多根据上面的数据得到31,32,35,36
31,32.35,43
31,32,36,43
31,35,36,43
...上面这个结果位数是能够根据需求变化的,例如 4位的所有不重复组合 3位的所有不重复组合...组合的函数这里有一个,可以减少您的劳动量,如果你觉得他不够好可以根据情况做一个.function Combination($arr, $size = 1) {
$len = count ( $arr );
$max = pow ( 2, $len ) - pow ( 2, $len - $size );
$min = pow ( 2, $size ) - 1; $r_arr = array ();
for($i = $min; $i <= $max; $i ++) {
$count = 0;
$t_arr = array ();
for($j = 0; $j < $len; $j ++) {
$a = pow ( 2, $j );
$t = $i & $a;
if ($t == $a) {
$t_arr [] = $arr [$j];
$count ++;
}
}
if ($count == $size) {
$r_arr [] = $t_arr;
}
}
return $r_arr;
}============
如果您觉得我描述得不够清晰,可以询问我更多的问题,我有很多截图...咔咔,别人是用js写的,我只能截图结果.来提供给你参考.我需要一个函数,输入一个数组 或者其他什么 输出一个一维数组 数组里是根据需要的位数产生的所有组合.例如function showme(arr,len)
{
$r=[];
return $r;
}

解决方案 »

  1.   

    你试试这个
    算法一:<?php
    function func($first = '', $arr, &$results = array())
    {
            $len = count($arr);
            if($len == 1) {
                    $results[] = $first . $arr[0];
            } else {
                    for($i=0; $i<$len; $i++) {
                            $tmp = $arr[0];
                            $arr[0] = $arr[$i];
                            $arr[$i] = $tmp;
                            func($first.$arr[0], array_slice($arr, 1), $results);
                    }
            }
    }
    $arr = range('A', 'E');
    $results = array();
    func('', $arr, &$results);
    print_r($results);
    ?>算法二是论坛另外一个朋友提供的,效率比较不错:/* * 排列组合回溯算法:
     * 1. 从 $source 尾部开始往前寻找两个相邻元素($x,$y),这两个元素的值满足条件($x < $y),即前一个比后一个元素大;
     * 2. 再次从 $source 尾部开始向前查找,找出第一个大于 $x 的元素($z),交换 $x 和 $z 元素的值;
     * 3. 将 $y 及其之后的所有元素逆向排列,所得排列即为 $source 的下一个组合排列形式。
     */
    $source = array(1,2,3,'a');
    sort($source); //保证初始数组是有序的
    $last = count($source) - 1; //$source尾部元素下标
    $x = $last;
    $count = 1; //组合个数统计
    echo implode(',', $source), "\n"; //输出第一种组合
    while (true) {
        $y = $x--; //相邻的两个元素
        if ($source[$x] < $source[$y]) { //如果前一个元素的值小于后一个元素的值
            $z = $last;
            while ($source[$x] > $source[$z]) { //从尾部开始,找到第一个大于 $x 元素的值
                $z--;
            }
            /* 交换 $x 和 $z 元素的值 */
            list($source[$x], $source[$z]) = array($source[$z], $source[$x]);
            /* 将 $y 之后的元素全部逆向排列 */
            for ($i = $last; $i > $y; $i--, $y++) {
                list($source[$i], $source[$y]) = array($source[$y], $source[$i]);
            }
            echo implode(',', $source), "\n"; //输出组合
            $x = $last;
            $count++;
        }
        if ($x == 0) { //全部组合完毕
            break;
        }
    }
    echo 'Total: ', $count, "\n";
      

  2.   

    另外再给你提供几个参考地址你看看
    http://hi.baidu.com/dpj666666/blog/item/95e4cf181a1fefa14bedbc1c.html
    http://hi.baidu.com/mallor/blog/item/6ec127f74ae58f35730eecd5.html
    http://hi.baidu.com/wdar1314/blog/item/8fd87bacae6f3d1e4b36d6a1.html
    http://hi.baidu.com/ztfmy/blog/item/d71105390f91c4fe54e723ad.html
    http://hi.baidu.com/saintqdd/blog/item/dfff9ed74e64dec8a044df41.html补充一下,帮我加分就好了,钱你自己留着吧,我不需要.
      

  3.   

    先感谢一下sibang. 
    不过好像不是我要的答案哈...至于钱嘛,那是一定要送出去的.要不以后怎么混.咔咔
      

  4.   

    function showme($arr,$len)
    {
    $arrays = Combination($arr,$len);
    foreach($arrays as $value){
    $r[] = implode(",",$value);
    }
    return $r;
    }
    $as =  showme(Array(2,5,8,7),2);
    echo "<pre>";
    print_r($as);
    echo "</pre>";结果:
    Array
    (
        [0] => 2,5
        [1] => 2,8
        [2] => 5,8
        [3] => 2,7
        [4] => 5,7
        [5] => 8,7
    )
      

  5.   

    那有没有max值,比如列数最大不超过多少,行数最大不超过多少
      

  6.   

    不是很明白你的意思
    数组可能是   
    01
    02 03 04 05
    06 07
    08 09是否可理解为可组装成一个数组
    $ar = array( '01', '02', '03', '04', '05', '06', '07', '08', '09' );
    如果是,那么你不是已有求组合的函数了吗?
    print_r(Combination($ar, 2)); 
    print_r(Combination($ar, 3)); 
    print_r(Combination($ar, 4)); 
      

  7.   

    版主老大.您在 笛卡尔积里已经理解我的意思了,不过我发烧口齿不清.
    你看print_r( Descartes( Descartes($a, $b), $c ) );那么假如我有好多个 变量 一直到 $z呢 那咋组织呀.还有 结果出来是4位的组合,我还需要 3位 和2位的 其实就是这个问题。可能就是您的 print_r( Descartes( Descartes($a, $b), $c ) ); 之后再做一个Combination.咔咔...
      

  8.   


    function combo(m,n){
    var arr=[],sumArr=[],str,isBreak=false;
    for(var i=0;i<m;i++){
    arr.push(0);
    }
    for(var i=0;i<n;i++){
    arr[i]=1;
    }
    str=arr.join('');
    while(1){
    var itemArr=[],
    reg=/(.*?)(10)/;
    for(var j=0,len=str.length;j<len;j++){
    str.charAt(j)!="0"&&itemArr.push(j);
    }
    sumArr.push(itemArr);
    if(reg.test(str)){
    str=str.replace(reg,function(l,s1,s2){
    var num=s1.replace(/0/g,"").length,
    prefixstr="";
    for(var i=0,len=s1.length;i<len;i++){
    prefixstr+=(i<num?'1':'0');
    }
    return prefixstr+"01";
    });
    }else{
    break;
    }
    }
    return sumArr;
    }
    var t=combo(4,3);function doubleCombo(arr,n){
    var arrLen=arr.length,finalArr=[];
    if(arrLen<n) {
    alert("invalid input!");
    return;
    }
    var comboCol=combo(arrLen,n);//行序号组合数
    for(var i=0,cl=comboCol.length;i<cl;i++){//得到组合的每一项
    var colItem=comboCol[i],items=[[]];
    for(var j=0,il=colItem.length;j<il;j++){
    var data=arr[colItem[j]];
    if(typeof data=="number"){
    for(var k=0,itemsLen=items.length;k<itemsLen;k++){
    items[k].push(data);
    }
    }
    else{
    var mitems=[];
    for(var m=0;m<items.length;m++){
    for(var n=0;n<data.length;n++){
    var mitem=items[m].concat([]);
    mitem.push(data[n]);
    mitems.push(mitem);
    //console.log(mitem);
    //console.log(mitems);
    }
    }
    items=mitems;

    }
    }
    finalArr=finalArr.concat(items);
    }
    return finalArr;
    }
    //下面是调用和结果显示var t=doubleCombo([32,[24,34,43,44,46,47],35,36,42],4)
    for(var k=0,l=t.length;k<l;k++){
    var a=t[k];
    for(var j=0,l2=a.length;j<l2;j++)
    document.write(a[j]+' ');
    document.write('<br/>');
    }写了一个玩玩儿,看是否为想要的。
      

  9.   

    /**
     * 得到排序组合
     * 采用二进制方法进行组合的选择,如表示5选3时,只需有3位为1就可以了,所以可得到的组合是 01101 11100 00111 10011 01110等10种组合
     *
     * @param 需要排列的数组 $arr
     * @param 最小个数 $min_size
     * @return 满足条件的新数组组合
     */
    function pl($arr,$size=5) {
      $len = count($arr);
      $max = pow(2,$len);
      $min = pow(2,$size)-1;
      $r_arr = array();
      for ($i=$min; $i<$max; $i++){
       $count = 0;
       $t_arr = array();
       for ($j=0; $j<$len; $j++){
        $a = pow(2, $j);
        $t = $i&$a;
        if($t == $a){
         $t_arr[] = $arr[$j];
         $count++;
        }
       }   
       if($count == $size){
        $r_arr[] = $t_arr;    
       }   
      }
      return $r_arr;
     } $pl = pl(array(1,2,3,4,5,6,7),5);var_dump($pl);
    http://zuo.ai.xiao.blog.163.com/blog/static/60791553201032042026862/这个是一维数列的组合,LZ参考一下
      

  10.   


    function combo(m,n){
    var arr=[],sumArr=[],str,isBreak=false;
    for(var i=0;i<m;i++){
    arr.push(0);
    }
    for(var i=0;i<n;i++){
    arr[i]=1;
    }
    str=arr.join('');
    while(1){
    var itemArr=[],
    reg=/(.*?)(10)/;
    for(var j=0,len=str.length;j<len;j++){
    str.charAt(j)!="0"&&itemArr.push(j);
    }
    sumArr.push(itemArr);
    if(reg.test(str)){
    str=str.replace(reg,function(l,s1,s2){
    var num=s1.replace(/0/g,"").length,
    prefixstr="";
    for(var i=0,len=s1.length;i<len;i++){
    prefixstr+=(i<num?'1':'0');
    }
    return prefixstr+"01";
    });
    }else{
    break;
    }
    }
    return sumArr;
    }function doubleCombo(arr,n){
    var arrLen=arr.length,finalArr=[];
    if(arrLen<n) {
    alert("invalid input!");
    return;
    }
    var comboCol=combo(arrLen,n);//行序号组合数
    for(var i=0,cl=comboCol.length;i<cl;i++){//得到组合的每一项
    var colItem=comboCol[i],items=[[]];
    for(var j=0,il=colItem.length;j<il;j++){
    var data=arr[colItem[j]];
    if(typeof data=="number"){
    for(var k=0,itemsLen=items.length;k<itemsLen;k++){
    items[k].push(data);
    }
    }
    else{
    var mitems=[];
    for(var m=0;m<items.length;m++){
    for(var n=0;n<data.length;n++){
    var mitem=items[m].concat([]);
    mitem.push(data[n]);
    mitems.push(mitem);
    //console.log(mitem);
    //console.log(mitems);
    }
    }
    items=mitems;

    }
    }
    finalArr=finalArr.concat(items);
    }
    return finalArr;
    }
    //下面是调用和结果显示var t=doubleCombo([32,[24,34,43,44,46,47],35,36,42],3)
    for(var k=0,l=t.length;k<l;k++){
    var a=t[k];
    for(var j=0,l2=a.length;j<l2;j++)
    document.write(a[j]+' ');
    document.write('<br/>');
    }
    上面多了个东西
      

  11.   

    我二掉了,你要PHP的?当我没发
      

  12.   


    别急,js一样有效.现在 php js 解出来的我都兑现我的承诺! 
      

  13.   

    感谢 JParser.你的答案100分.麻烦你留下支付宝帐号,不方便可以PM我另外请教一下 因为JS我也是初学所以
    var t=doubleCombo([[31,42],32,43,35,36],4)这里 因为我不知道对方可能是输入一个还是 多个数字 也就是不知道是不是要产生一个数组
    这里怎么解决好呢?例如
    对方输入的数字是保存在 
    <input type="hidden" id="di1" value="31,42">
    <input type="hidden" id="di2" value="32">
    <input type="hidden" id="di3" value="43,35,36">也就是我如何取得这些数值 赋值给函数。不好意思 js 刚学不到2周.我知道 读id 给变量,但是不知道怎么安排这个数组..doubleCombo 见笑了.
      

  14.   


    <input type="hidden" id="di1" value="31,42">
    <input type="hidden" id="di2" value="32">
    <input type="hidden" id="di3" value="43,35,36">针对上面这种可以var dataArr=[];
    var d1=document.getElementById("di1").value.split(',');
    var d2=document.getElementById("di2").value.split(',');
    var d3=document.getElementById("di3").value.split(',');
    dataArr.push(d1);
    dataArr.push(d2);
    dataArr.push(d3);
    //var t=doubleCombo([32,[24,34,43,44,46,47],35,36,42],4)
    var t=doubleCombo(dataArr,2)
    加分就行,钱就算了吧,我也就新手。上面的程序的缺点是行数最好不超过31行。
      

  15.   

    看了一会 发现个新问题。这个行我也是动态生成的,所以我不清楚具体可能有多少行 所以这个
    var dataArr=[];
    var d1=document.getElementById("di1").value.split(',');
    var d2=document.getElementById("di2").value.split(',');
    var d3=document.getElementById("di3").value.split(',');
    我怎么样去var 根据可能的行数定义一个变量呢?请教?遍历所有input id 如果包含有特征的ID 那么 生成一个数组,是这样吧for (i=0;i<xxx.length;i++)
    {
    var d[i]=document.getElementById('di'+i).value.split(',');
    dataArr.push(d[i]);
    }
      

  16.   


    恳请 Jparser 将支付宝帐号PM给小弟.再次感谢,另外请在JS板块回复帖子 我好给分.
    http://topic.csdn.net/u/20110603/09/00cece88-3c28-4443-ab1f-3c1956ce2421.html?37047
      

  17.   

    再次感谢JParser.
    此帖结给Jparser.php代码有人写出的请pm我.我将另开贴结贴.