我用php生成了一个序列号,这个序列号的长度是16个字符,我想用短划线(-)字符将这个序列号拆分为4个字符,就像这种格式xxxx-xxxx-xxx-xxxx,所以我写了这个php代码:
for ($d=0; $d<=3; $d++){
$tmp .= ($tmp ? "-" : null).substr($serial,$d,4);
}
所以这个循环将返回一个xxxx-xxxx-xxx-xxxx格式的序列号,
我想知道php中有什么更好的方法或功能吗?
我在网上搜索了一下,找到了sprintf
和number_format
,但我不知道如何将此功能用于这种格式!
我会使用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
试试这个:
$str = "xxxxxxxxxxxxxxxx";
echo substr(chunk_split($str, 4, '-'), 0, -1);
输出:
xxxx-xxxx-xxxx-xxxx
参考编号:http://www.php.net/manual/en/function.chunk-split.php
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_splite方法一样清晰。
您可以尝试str_split()和内爆(),例如:
$tmpArray = str_split($tmp, 4);
$serialNumber = implode('-', $tmpArray);