0

我用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中有没有更好的方法或功能?

我在互联网上搜索我找到了sprintfnumber_format但我不知道如何将这个功能用于这种格式!

4

4 回答 4

7

我会使用str_split()implode()

$result = implode( '-', str_split( $serial, 4));

str_split()将字符串分解为一个数组,其中每个元素有 4 个字符。然后,implode()用破折号将这些数组片段连接在一起。

所以,如果我们生成一个随机数$serial

$serial = substr(md5(uniqid(rand(), true)), 0, 16);

我们将得到类似于以下内容的输出:

59e6-997f-8446-80a2 
于 2013-07-25T12:22:25.853 回答
4

尝试这个 :

$str   = "xxxxxxxxxxxxxxxx";
echo substr(chunk_split($str, 4, '-'), 0, -1); 

输出 :

xxxx-xxxx-xxxx-xxxx

参考:http ://www.php.net/manual/en/function.chunk-split.php

于 2013-07-25T12:23:04.253 回答
1

str_split,相当清楚...

$hyphenated = implode( '-', str_split( $str, 4));

这很清楚,但是生成一个数组只是为了内爆它似乎有点浪费。所以我想知道是否还有其他方法...

使用 preg_replace 更快?

我尝试了一个正则表达式,认为这将消除对中间数组的需要。毕竟,为什么有一个问题,当你可以有两个时!

$hyphenated = preg_replace('/(.{4})(?=.)/', '$1-', $str);

那个小野兽会寻找 4 个字符,只要它们后面至少还有一个字符,就会在它们后面插入一个斜杠。

麻烦的是,结果慢了大约 25% :(

chunk_split 更快,并且具有相同的薄荷味!

Prasanth Bendra 发布了一个非常有效的答案,不需要中间数组

$hyphenated=substr(chunk_split($str, 4, '-'), 0, -1); 

结果!这比在 16 个字符的输入字符串上测量的 str_split 至少快 25%,并且与 str_split 方法一样清晰。

于 2013-07-25T12:27:32.693 回答
0

您可以使用implode()尝试str_split() ,例如:

$tmpArray = str_split($tmp, 4);
$serialNumber = implode('-', $tmpArray);
于 2013-07-25T12:23:54.220 回答