





Используйте str_split ():
$string = '0123456789012345';
$sets = str_split($string, 4);
print_r($sets);
Выход:
Array
(
[0] => 0123
[1] => 4567
[2] => 8901
[3] => 2345
)
Затем, конечно, чтобы вставить дефис между наборами, вы просто взорваться () их вместе:
echo implode('-', $sets); // echoes '0123-4567-8901-2345'
Да, отредактировал это, пока вы комментировали. Сначала я предположил, что он знает функцию implode ().
Я знаю, я тоже знаю, как это сделать, я был: а) надеялся на что-то другое, о чем я еще не знал, б) предлагал это другим людям, так как меня спрашивали об этом сегодня 3 раза.
Какой источник данных? Если это БД, вы можете сделать так, чтобы БД отформатировала ее для вас еще до того, как она дойдет до PHP.
Если вы ищете более гибкий подход (например, для телефонных номеров), попробуйте регулярные выражения:
preg_replace('/^(\d{4})(\d{4})(\d{4})(\d{4})$/', '\1-\2-\3-\4', '0123456789012345');
Если вы не видите, первый аргумент принимает четыре группы по четыре цифры в каждой. Второй аргумент форматирует их, а третий аргумент - ваш ввод.
Я не уверен, что это сработает лучше? preg_replace ('/ (\ d {4}) /', '- \ 1', '0123456789012345');
Это не сработает, так как вы останетесь с "-", висящим перед выходом. Это также убивает часть гибкости. Однако я отредактировал свое сообщение, чтобы использовать синтаксис {4}.
Это немного более общее:
<?php
// arr[string] = strChunk(string, length [, length [...]] );
function strChunk() {
$n = func_num_args();
$str = func_get_arg(0);
$ret = array();
if ($n >= 2) {
for($i=1, $offs=0; $i<$n; ++$i) {
$chars = abs( func_get_arg($i) );
$ret[] = substr($str, $offs, $chars);
$offs += $chars;
}
}
return $ret;
}
echo join('-', strChunk('0123456789012345', 4, 4, 4, 4) );
?>
Предполагая, что OP хочет вставить дефис, вы, вероятно, захотите выполнить implode ('-', $ sets).