良く使う文字数制限の処理。
良く使うくせに頭が悪いのでどれがどれだったか忘れてしまいます。

substr/mb_substr/mb_strimwidthの書き方

<?php
 echo substr('hogehogehogehoge', 0, 4);
 echo mb_substr('hogehogehogehoge', 0, 4);
 echo mb_strimwidth('hogehogehogehoge'),0,4);
?>

()の中に

(対象の文字列,開始文字数,取りだす文字数)

の順に指定します。違いは、

substr => バイト数でカウント。半角1文字で1バイト、全角1文字で2バイト。 
mb_substr => 文字数でカウント。全角も半角も1文字としてカウント。
mb_strimwidth => 文字数でカウント。全角は2文字、半角は1文字としてカウント。

という違いです。
バイト数でカウントを行うsubstr に対して、mb_substr と mb_strimwidth は取りだした後の文字コードが指定できます。
また、substr と mb_strimwidth はほぼ同じ動きをしますが、mb_strimwidthの方は文字を取りだした後に付ける要素を指定する事が出来ます。

<?php
 echo mb_strimwidth('hogehogehogehoge'),0,4,'UTF-8','…');
?>

こんな感じ。
substr を使うと中途半端に取りだした文字が文字化けをしたりするのでmb_substr か mb_strimwidth を使うのが良さそうです。