LoginSignup
5
0

More than 1 year has passed since last update.

Symfony Stringでアローラロコンをアーロンにする

Last updated at Posted at 2022-07-27

PHPの標準機能でもアローラロコンをアーロンにできるのだが、SymfonyのString Componentというやつがちょっとおしゃれな文字列演算を提供しているので、せっかくなのでこれを使ってみよう。

Symfony String Componentとは

だいたいドキュメントを見ればわかる。

Symfony StringはByteString CodePointString UnicodeStringという3種類のクラスを用意しているが、基本はUnicodeStringが扱う書記素(grapheme)という単位で扱うのがいいだろう。

image.png

Stringオブジェクトを作る

普通の文字列値をStringオブジェクトに変えるにはnewで新しいインスタンスを作る方法とヘルパー関数を使う方法がある。

まあ、こだわりがなければヘルパー関数を使っておくと見ためがすっきりするだろう。

<?php
use function Symfony\Component\String\u;

$str = u('アローラロコン');
//=> Symfony\Component\String\UnicodeString {#2673}

uという短かすぎる関数名が趣味に合わなければ、 use function Symfony\Component\String\u as unicode;のようにすると、そのファイル内では unicode('文字列') のように扱える。

さて、Symfony Stringオブジェクトは(string)キャストすると普通の文字列値に戻せる。

>>> (string)$str
//=> "アローラロコン"

chunkとarray_map()とsliceを使う方法

<?php
use function Symfony\Component\String\u;

echo implode(array_map(fn($s) => $s->slice(0, 1), u('アローラロコン')->chunk(2)));
  • 元の文字列をSymfonyのUnicodeStringにする
    • u('アローラロコン')
  • UnicodeString::chunk()で文字列を分解する
    • [u('アロ'), u('ーラ'), u('ロコ'), u('ン')]
  • array_map()でそれぞれの要素から UnicodeString::slice() で1文字だけ抜き出す
    • [u('ア'), u('ー'), u('ロ'), u('ン')]
  • implode()を1個の文字列に結合する
    • 'アーロン'
    • 配列の要素はstringではなくUnicodeStringオブジェクトなのだが、implode()関数は配列要素がstringではなかったときに(string)キャストしてくれる
  • 完成!

UnicodeStrging::join()というメソッドもあり、これを使うとstringにキャストせずUnicodeStringのまま結合できるのだが、今回はそのまま出力するので標準関数のimplode()をそのまま呼んでしまってよい。

echo u('')->join(array_map(fn($s) => $s->slice(0, 1), u('アローラロコン')->chunk(2)));

chunkとarray_chunk()とarray_column()を使う方法

<?php
use function Symfony\Component\String\u;

echo implode(array_column(array_chunk(u('アローラロコン')->chunk(), 2), 0));

PHPの解法とほとんど変わらないので手順は割愛する。手数は一見多そうだがコードとしてはarray_map()を噛ませるよりちょっぴり短い。

動作確認

https://phpsandbox.io/n/lively-forest-ddgd-3shiu にまとめてある。

余談だが、普段オンラインサンドボックス環境で使っている3v4lは軽量かつPHPの複数バージョンを同時実行できて便利だが、ライブラリに依存したコードが書けない。phpsandbox.ioは任意のComposerパッケージを追加した状態で実行できるので、場合によって使い分けるのがいいだろう。

まとめ

文字列処理にはSymfony Stringを使え。

なんかもうちょっと短く書ける解法がありそうな気もするのでSymfonyマスターのひとは教えてください。

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0