V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jiangle
V2EX  ›  问与答

小白请教: PHP 生成有序数的问题。

  •  
  •   jiangle · 2015-11-12 02:04:05 +08:00 · 1952 次点击
    这是一个创建于 3089 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我想用 PHP 生成 6 位数以内的有序组合,没个数不重复。
    <?php
    $arr = array('1','2','3','','5'','6','7','8','9');

    ?>

    用数组里的这些数来组合,从 1 开始,例如:
    111111
    111112
    111113
    111114
    这样递增下去。。。

    请问要用到哪些函数呢?
    15 条回复    2015-11-12 17:09:43 +08:00
    cxbig
        1
    cxbig  
       2015-11-12 02:06:15 +08:00
    如果你的种子数组已经确定,用一个 str_pad 就行了。
    jiangle
        2
    jiangle  
    OP
       2015-11-12 02:17:45 +08:00
    @cxbig 我是用数组里的 8 个数字,每一个下标都与其他 7 个下标有序组合,然后遍历出来。
    cxbig
        3
    cxbig  
       2015-11-12 02:22:35 +08:00
    @jiangle 你说要生成一个二维数组?抱歉没有理解你的意思。
    jiangle
        4
    jiangle  
    OP
       2015-11-12 02:24:23 +08:00
    @cxbig 这么说吧,我要统计 6 位数以内,不带 04 组合成的 6 位数的数量,并且把他们生成出来。
    cxbig
        5
    cxbig  
       2015-11-12 02:30:50 +08:00
    @jiangle 再确认一下:从 0 ~ 999999 ,不够位数的前面补 0 。是这个意思把?
    jiangle
        6
    jiangle  
    OP
       2015-11-12 02:37:59 +08:00
    @cxbig 0~999999 以内,不包括 04 的都要生成遍历出来呢。
    cxbig
        7
    cxbig  
       2015-11-12 02:54:04 +08:00
    既然要输出结果,只能用遍历了
    for 循环 0 ~ 999999
    加左 pad
    正则或 strpos 找对应字符串做判断,输出没找到的
    jiangle
        8
    jiangle  
    OP
       2015-11-12 03:14:55 +08:00
    @cxbig
    <?php
    for($i=111111;$i<=999999;$i++){

    if(strstr($i,"0") == FALSE OR strstr($i,"4") == FALSE){
    $arr[] = $i;
    }
    }
    foreach($arr as $a){
    $handle=fopen("7.txt","a+");
    $a = $a ."\r\n";
    fwrite($handle,$a);
    fclose($handle);
    }
    ?>

    我这样它还会生成 0 和 4 的...
    cxbig
        9
    cxbig  
       2015-11-12 03:23:19 +08:00
    @jiangle
    以上例子惨不忍睹,主要的 2 个性能问题:
    1. 文件只打开一次就可以了;
    2. for 循环直接判断写入文件,不要存数组再遍历,太占内存。

    你的 0 和 4 分开的?我还以为组合呢,判断用正则
    preg_match('/[04]/', $string)
    返回 true 的跳过
    jiangle
        10
    jiangle  
    OP
       2015-11-12 03:34:28 +08:00
    @cxbig 反正带 0 或 4 的都不要。
    cxbig
        11
    cxbig  
       2015-11-12 03:39:33 +08:00
    @jiangle 上面不是说的很清楚了?还要我给你写出来不成?
    msg7086
        12
    msg7086  
       2015-11-12 07:23:13 +08:00
    如果是问算法的话,这个就是个 8 进制数字生成而已。
    生成完了用下标转一下就好。

    随便写了个 ruby 版的。

    https://gist.github.com/msg7086/4fa5a3d344c1118bc98c

    # => ["11", "12", "13", "15", "16", "17", "18", "19", "21", "22", "23", "25", "26", "27", "28", "29", "31", "32", "33", "35", "36", "37", "38", "39", "51", "52", "53", "55", "56", "57", "58", "59", "61", "62", "63", "65", "66", "67", "68", "69", "71", "72", "73", "75", "76", "77", "78", "79", "81", "82", "83", "85", "86", "87", "88", "89", "91", "92", "93", "95", "96", "97", "98", "99"]
    quericy
        13
    quericy  
       2015-11-12 09:15:45 +08:00
    @jiangle 9L 的意思是循环生成,写入前用正则判断这次生成的是不是包含 0 和 4,包含就不写入
    zmj1316
        14
    zmj1316  
       2015-11-12 09:52:56 +08:00
    @cxbig 我觉得是你理解复杂了,就是去掉 0 和 4 来组成数字,就是个 8 进制的问题
    cxbig
        15
    cxbig  
       2015-11-12 17:09:43 +08:00
    @zmj1316 就是一个简单的遍历, LZ 的 0 和 4 逻辑判断错了而已。你提 8 进制人家更头昏了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2897 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 07:51 · PVG 15:51 · LAX 00:51 · JFK 03:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.