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 で高速化?

中間配列が不要になると考えて、正規表現を試しました。結局のところ、問題が 1 つあるのに、問題が2 つあるのに!

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

その小さな野獣は 4 文字を探し、少なくともあと 1 文字が続く限り、それらの後にスラッシュを挿入します。

問題は、約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 に答える