質問: mb_strimwidth($str,5,2); ```
回答: 効率的というのが、 メモリや計算量が少なくて、条件が少ないという意味であれば、 質問のように文字列で抽出して、それを比較することが最も効率的でしょう。 `date()`等の日付系の関数は計算をして表現するのでどうしてもCPUやメモリを食うことになるので文字処理で対応できるのであればそれが最も早くてシンプルです。 またmb_strimwidth使ってますが基本的にマルチバイトの文字が飛んでこないことを前提に substrで十分かと思います さらに条件もよりシンプルに考えて 同一年月の場合 それ以外で同一年の場合 それ以外の場合 にできると思います。 ついでに年と月を抽出の必要もなく、 同一年の条件→開始位置0から4バイト目まで一緒 同一年月の条件→開始位置0から7バイト目まで一緒 それ以外 という形にできると思います。 上記のことを考えると、以下の感じでしょう。 ``` if (substr($str1, 0, 7) == substr($str2, 0, 7)) { return intval(substr($str2, 8, 2)) . "日"; }else if (substr($str1, 0, 4) == substr($str2, 0, 4)) { return intval(substr($str2, 6, 2)) . "月" . intval(substr($str2, 8, 2)) . "日"; }else { return intval(substr($str2, 0, 4)) . "月" . intval(substr($str2, 6, 2)) . "月" . intval(substr($str2, 8, 2)) . "日"; } ``` なんだか愚直でみっともなく、可読性も悪いのでDocやコメントでフォローは必要そうです。 また、あまりない要求とは思いますが、年が3桁だったり2桁を許容するようなシステムの場合は渡してくるデータに0パディングが必要になると思います。