2013-07-25 4 views
0

Я сгенерировал серийный номер с php, длина этого серийного номера составляет 16 символов, я хочу разделить этот серийный номер на 4 символа с тире (-), как этот формат xxxx-xxxx-xxxx-xxxx, поэтому я написал это PHP код:Как разделять символы с символом «-»?

for ($d=0; $d<=3; $d++){ 
    $tmp .= ($tmp ? "-" : null).substr($serial,$d,4); 
} 

так что этот цикл будет возвращать серийный номер с форматом хххх-хххх-хххх-хххх,

Я хочу знать, есть ли лучший способ или функции в PHP?

Я искал в Интернете Я нашел sprintf и number_format, но я не знаю, как использовать эту функцию для этого формата!

ответ

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

str_split, довольно ясный ...

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

Это довольно ясно, но похоже, расточительно генерировать массив только для его взрыва. Поэтому я задавался вопросом, есть ли другой способ ...

Быстрее с preg_replace?

Я пробовал регулярное выражение, думая, что это устранит необходимость в промежуточном массиве. В конце концов, почему есть одна проблема, когда у вас может быть two!

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

Этот маленький Beastie выглядит для 4-х символов, и до тех пор они следуют, по крайней мере, еще один символ, будет вставить косую черту после них.

Беда в том, что, оказалось, около 25% медленнее :(

chunk_split быстрее и с тем же самым большим мятным вкусом!

Prasanth Bendra опубликовал довольно эффективный ответ, который не нуждается в промежуточного массиве

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

Результата! Это было как минимум на 25% быстрее, чем использование str_split, измеренное на входной строке 16 символов, и так же ясно, как метод str_split.

Смежные вопросы