tohokuaikiのチラシの裏

技術的ネタとか。

文字列を規定の区切り文字で区切る(ったり色々する)関数

<?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