<?php /** * @brief 文字列を右からN桁区切りにする * @param 文字列 * @param 区切り数 * @param 区切り文字 * @param パディング文字 * @param 最短文字数:足らない場合はパディングする * @retval */ function convDigit($str, $num = 3, $glue = '/', $padding = '0', $min_length = null) { $str = strrev(strval($str)); $ret = array(); $fragment = ""; for ($i=0; $i< strlen($str); $i++){ $fragment = $str{$i}.$fragment; if (strlen($fragment) === $num){ $ret[] = $fragment; $fragment = ""; } } if ($fragment){ $ret[] = sprintf('%'.$padding.$num.'s', $fragment); } if ($min_length && $num * count($ret) < $min_length){ $ret = array_pad($ret, ceil($min_length / $num), sprintf('%'.$padding.$num.'s', '')); } return implode("/", array_reverse($ret)); }
テスト
<?php $n = ""; for ($i=1; $i<20; $i++){ $n .= $i; echo convDigit($n, 3, '/', '0', 20)."\n"; }
↓
000/000/000/000/000/000/001 000/000/000/000/000/000/012 000/000/000/000/000/000/123 000/000/000/000/000/001/234 000/000/000/000/000/012/345 000/000/000/000/000/123/456 000/000/000/000/001/234/567 000/000/000/000/012/345/678 000/000/000/000/123/456/789 000/000/000/012/345/678/910 000/000/001/234/567/891/011 000/000/123/456/789/101/112 000/012/345/678/910/111/213 001/234/567/891/011/121/314 123/456/789/101/112/131/415 012/345/678/910/111/213/141/516 001/234/567/891/011/121/314/151/617 123/456/789/101/112/131/415/161/718 012/345/678/910/111/213/141/516/171/819