我用php生成了一个序列号,这个序列号的长度是16个字符,我想用4个字符用破折号( - )分割这个序列号,就像这个格式xxxx-xxxx-xxxx-xxxx所以我写了这个PHP代码:
for ($d=0; $d<=3; $d++){
$tmp .= ($tmp ? "-" : null).substr($serial,$d,4);
}
所以这个循环将返回一个xxxx-xxxx-xxxx-xxxx格式的序列号,
我想知道php中有没有更好的方法或功能?
我在互联网上搜索了sprintf
和number_format
,但我不知道如何将此功能用于此格式!
答案 0 :(得分:7)
我会使用str_split()
和implode()
:
$result = implode( '-', str_split( $serial, 4));
str_split()
会将字符串分解为数组,其中每个元素都有4个字符。然后,implode()
用短划线连接这些数组。
因此,如果我们使用:
生成随机$serial
$serial = substr(md5(uniqid(rand(), true)), 0, 16);
我们会得到类似于as output的内容:
59e6-997f-8446-80a2
答案 1 :(得分:4)
试试这个:
$str = "xxxxxxxxxxxxxxxx";
echo substr(chunk_split($str, 4, '-'), 0, -1);
输出:
xxxx-xxxx-xxxx-xxxx
答案 2 :(得分:1)
$hyphenated = implode( '-', str_split( $str, 4));
这很清楚,但生成一个数组只是为了破坏它似乎有点浪费。所以我想知道是否有另一种方式...
我尝试了一个正则表达式,认为这将消除对中间数组的需求。毕竟,为什么有一个问题,当你可以two!
$hyphenated = preg_replace('/(.{4})(?=.)/', '$1-', $str);
那个小小的野兽会寻找4个字符,只要它们后面跟着至少一个字符,就会在它们之后插入一个斜线。
麻烦的是,结果慢了大约25%:(
Prasanth Bendra发布了一个非常有效的答案,不需要中间数组
$hyphenated=substr(chunk_split($str, 4, '-'), 0, -1);
结果!这比使用16字符输入字符串测量的str_split快至少25%,并且与str_split方法一样清晰。
答案 3 :(得分:0)
您可以使用str_split()尝试implode(),例如:
$tmpArray = str_split($tmp, 4);
$serialNumber = implode('-', $tmpArray);