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

2015-11-12 02:04:05 +08:00
 jiangle
我想用 PHP 生成 6 位数以内的有序组合,没个数不重复。
<?php
$arr = array('1','2','3','','5'','6','7','8','9');

?>

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

请问要用到哪些函数呢?
1958 次点击
所在节点    问与答
15 条回复
cxbig
2015-11-12 02:06:15 +08:00
如果你的种子数组已经确定,用一个 str_pad 就行了。
jiangle
2015-11-12 02:17:45 +08:00
@cxbig 我是用数组里的 8 个数字,每一个下标都与其他 7 个下标有序组合,然后遍历出来。
cxbig
2015-11-12 02:22:35 +08:00
@jiangle 你说要生成一个二维数组?抱歉没有理解你的意思。
jiangle
2015-11-12 02:24:23 +08:00
@cxbig 这么说吧,我要统计 6 位数以内,不带 04 组合成的 6 位数的数量,并且把他们生成出来。
cxbig
2015-11-12 02:30:50 +08:00
@jiangle 再确认一下:从 0 ~ 999999 ,不够位数的前面补 0 。是这个意思把?
jiangle
2015-11-12 02:37:59 +08:00
@cxbig 0~999999 以内,不包括 04 的都要生成遍历出来呢。
cxbig
2015-11-12 02:54:04 +08:00
既然要输出结果,只能用遍历了
for 循环 0 ~ 999999
加左 pad
正则或 strpos 找对应字符串做判断,输出没找到的
jiangle
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
2015-11-12 03:23:19 +08:00
@jiangle
以上例子惨不忍睹,主要的 2 个性能问题:
1. 文件只打开一次就可以了;
2. for 循环直接判断写入文件,不要存数组再遍历,太占内存。

你的 0 和 4 分开的?我还以为组合呢,判断用正则
preg_match('/[04]/', $string)
返回 true 的跳过
jiangle
2015-11-12 03:34:28 +08:00
@cxbig 反正带 0 或 4 的都不要。
cxbig
2015-11-12 03:39:33 +08:00
@jiangle 上面不是说的很清楚了?还要我给你写出来不成?
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
2015-11-12 09:15:45 +08:00
@jiangle 9L 的意思是循环生成,写入前用正则判断这次生成的是不是包含 0 和 4,包含就不写入
zmj1316
2015-11-12 09:52:56 +08:00
@cxbig 我觉得是你理解复杂了,就是去掉 0 和 4 来组成数字,就是个 8 进制的问题
cxbig
2015-11-12 17:09:43 +08:00
@zmj1316 就是一个简单的遍历, LZ 的 0 和 4 逻辑判断错了而已。你提 8 进制人家更头昏了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/235498

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX