mb_substr

  • 例えば以下のような7つの要素を持った配列がある。

    $item_arr = array('A','B','C','D','E','F','G');

    この配列の中身(要素)をすべて表示(出力)したい時

    最も簡単なのは

    PHP

    foreach($item_arr as $item){
        echo $item;
    }
    

    出力結果

    ABCDEFG

    要素の羅列で構わなければこれで良いが、個々の区切りが分からないから、普通は出力時に「、」やカンマ、「/」のような記号を付けて書き出す。

    PHP

    foreach($item_arr as $item){
        echo $item;
        echo ('/');
    }
    

    出力結果

    A/B/C/D/E/F/G/

    個々の区切りは判別しやすくなったが、各要素の出力時に「/」を付加しているため、当然最後の要素(G)の後にも「/」が書き出されている。
    このままではデータとして中途半端な感じが否めない。

    最後の「/」を削除するにはいくつかの方法がある。

    まずは、カンマ区切りのデータで最後のカンマを1つ削りたい時にも使う「rtrim」

    例)

    $str = rtrim($str, ",");
    

    次に、最後の文字を削除する「substr」

    $str = substr($str, 0, -1);
    

    ただしこの場合、区切りに2バイトの文字や記号を使っていると文字化けする。

    区切りに2バイト文字や2バイトの記号を使っている場合は、マルチバイトに対応した「mb_substr」を使う。
    引数に文字コードを正しく指定することがポイント。

    $str = mb_substr($str,0,1,"utf-8");
    

    そして別の方法として、最初から無駄なカンマや記号を出力しない方法もある。

    処理の流れ

    $item_arr = array(‘A’,’B’,’C’,’D’,’E’,’F’,’G’);

    配列の数をカウントする
    $cnt = count($item_arr);

    カウンターの初期化
    $i = 0;

    foreachで各処理を行う
    foreach($item_arr as $item){

    カウンターに1を加算
    $i++;

    要素を出力
    echo $item;

    カウンターが配列の個数と違う場合はカンマや「/」を付加
    if($cnt !=$i){echo(‘ / ‘);}
    }

    出力結果

    A/B/C/D/E/F/G

    解説

    配列の個数は常に「7」
    Aの時 → カウンター「1」 → 「/」を付加
    Bの時 → カウンター「2」 → 「/」を付加
    Cの時 → カウンター「3」 → 「/」を付加
    Dの時 → カウンター「4」 → 「/」を付加
    Eの時 → カウンター「5」 → 「/」を付加
    Fの時 → カウンター「6」 → 「/」を付加
    Gの時 → カウンター「7」

    Gの時、配列の個数「7」とカウンターの数値が一致するから「/」は付加されない。

    実際のスクリプト

    $item_arr = array('A','B','C','D','E','F','G');
    $cnt = count($item_arr);
    $i = 0;
    foreach($item_arr as $item){
        $i++;
        echo $item;
        if($cnt !=$i){echo(' / ');}
    }
    

    サクッと全部に付加して最後に削るか、ちょっと手間をかけて無駄な付加をしないようにするか、目的や状況に合わせて使い分けるといい。

  • タイトルや紹介文、URLなど、様々な文字数が想定される場合、きちんと文字数での切り詰めをしておかないとレイアウトが崩れたりすることがある。

    PHPで日本語の文字数カットには多くの場合mb_substrを使う方法が紹介されているが、文字を切り詰めた場合に「…」等を付加して元の文字が省略されていることを明示的にしたい場合、文字数のカウントをしておかないといけないためスマートとは言えない。

    例)mb_substrを使う方法

    最初にmb_strlenで文字数を数え、指定文字数よりも多い場合はmb_substrで切り詰める
    そのまま使えるコードのサンプルは以下

    $str = "ABCDEFG1023457890ABCDEFG1023457890";
    $cut_num = 20;
    
    if(mb_strlen($str) > $cut_num){
    $str_cut = mb_substr($str,0,$cut_num,"UTF-8")."...";
    }else{
    $str_cut = $str;
    }

    省略した時の表示処理も含めたい場合はmb_strimwidthを使うといい。

    そのまま使えるコードのサンプルは以下

    $str = "ABCDEFG1023457890ABCDEFG1023457890";
    $cut_num = 20;
    $str_cut = mb_strimwidth($str,0,$cut_num,"...","UTF-8");

    わずか一行で、指定文字数を越えた場合はカットして「…」を追加、指定文字内の場合はそのままとなる。