PHP Tips | 文字列処理:変換系 – kebab-case → camelCase

PHP PHP
スポンサーリンク

kebab-case と camelCase のイメージをそろえる

まずは形の違いをはっきりさせましょう。

kebab-case はこういうスタイルです。

user-name
created-at
max-retry-count

単語をすべて小文字にして、間をハイフン - でつなぎます。

camelCase はこうです。

userName
createdAt
maxRetryCount

最初の単語は小文字、2単語目以降の先頭を大文字にして、区切り文字は使いません。

今回やりたいのは、次のような変換です。

user-name       → userName
created-at      → createdAt
max-retry-count → maxRetryCount

フロントエンド(JavaScript)が kebab-case のキーを使っていて、
PHP 側では camelCase で扱いたい、という場面でよく出てきます。


変換の考え方を分解してみる

ステップに分けるとシンプルになる

kebab-case → camelCase は、次のステップに分解できます。

  1. - で文字列を分割して、「単語の配列」にする
  2. 1つ目の単語は全部小文字にする
  3. 2つ目以降の単語は「先頭だけ大文字+残りは小文字」にする
  4. それらをくっつける

例えば max-retry-count なら、

  1. ['max', 'retry', 'count'] に分割
  2. 1つ目 → max
  3. 2つ目 → Retry
  4. 3つ目 → Count
  5. くっつけて → maxRetryCount

この流れをそのままコードにすればよい、というイメージです。


素直な実装例を一つ書いてみる

kebab-case を camelCase に変換する関数

まずは読みやすさ重視で書いてみます。

/**
 * kebab-case を camelCase に変換
 *
 * @param string $kebab
 * @return string
 */
function kebabToCamel(string $kebab): string
{
    // すべて小文字にそろえておく(保険)
    $kebab = mb_strtolower($kebab, 'UTF-8');

    // "-" で分割して単語の配列にする
    $parts = explode('-', $kebab);

    // 先頭の単語(あれば)を取り出す
    $first = array_shift($parts);

    // 残りの単語の先頭を大文字にしていく
    $parts = array_map(function ($part) {
        // 先頭だけ大文字、残りは小文字
        $part = mb_strtolower($part, 'UTF-8');
        $firstChar = mb_substr($part, 0, 1, 'UTF-8');
        $rest      = mb_substr($part, 1, null, 'UTF-8');
        return mb_strtoupper($firstChar, 'UTF-8') . $rest;
    }, $parts);

    // 先頭+残りをくっつける
    return $first . implode('', $parts);
}
PHP

実際に動かしてみる

echo kebabToCamel('user-name');          // userName
echo kebabToCamel('created-at');         // createdAt
echo kebabToCamel('max-retry-count');    // maxRetryCount
echo kebabToCamel('id');                 // id
echo kebabToCamel('USER-NAME');          // userName
PHP

やっていることは、さっき分解したステップそのままです。


重要なポイントを少し深掘りする

なぜ最初に全部小文字にしているのか

$kebab = mb_strtolower($kebab, 'UTF-8');
PHP

ここをサボると、例えばこんな入力でおかしなことが起きます。

kebabToCamel('USER-NAME');
PHP

小文字化しない場合の流れはこうです。

分割すると ['USER', 'NAME']
2つ目の単語に「先頭だけ大文字」をしても、もともと全部大文字なので NAME のまま。
結果は USERNAME になり、camelCase ではありません。

小文字化する場合は、

  • 小文字化 → user-name
  • 分割 → ['user', 'name']
  • 2つ目 → Name
  • 結果 → userName

となり、期待どおりの camelCase になります。

つまり、

入力が全部大文字でも、全部小文字でも、混ざっていても、
最終的にきれいな camelCase にしたい

なら、最初に小文字にそろえるのがとても重要です。

なぜ mb_* 系を使っているのか

strtolower / strtoupper / substr でも英字だけなら動きますが、
UTF-8 前提のプロジェクトでは、最初から mb_strtolower / mb_strtoupper / mb_substr に寄せておく方が安全です。

今は英字だけでも、将来アクセント付き文字や他言語が混ざる可能性があります。
そのときに「一部だけマルチバイト非対応」という状態だと、バグの温床になりやすいので、
文字列処理は最初から mb_* で統一しておく、という設計がきれいです。


正規表現を使った、もう少しコンパクトな書き方

ロジックが理解できたら、正規表現で短く書くこともできます。

function kebabToCamel(string $kebab): string
{
    $kebab = mb_strtolower($kebab, 'UTF-8');

    return preg_replace_callback('/-([a-z])/', function ($matches) {
        return mb_strtoupper($matches[1], 'UTF-8');
    }, $kebab);
}
PHP

この関数は、

ハイフン - のあとに続く英小文字1文字を見つけて、
その1文字を大文字に置き換える、という動きをします。

max-retry-count の場合は、

  • -rR
  • -cC

となり、結果は maxRetryCount です。

ただし、正規表現に慣れていないと読みづらいので、
チーム開発や初心者向けには、explode で分割する版の方が理解しやすいことが多いです。


実務での使いどころ

フロントエンドのキー → PHP のプロパティ名

よくあるパターンはこれです。

フロントエンド(JavaScript)側の JSON が kebab-case のキーを使っている。

{
  "user-name": "Taro",
  "created-at": "2026-01-27T10:00:00Z"
}

PHP 側では camelCase のプロパティで扱いたい。

$data = [
    'user-name'  => 'Taro',
    'created-at' => '2026-01-27T10:00:00Z',
];

$object = new stdClass();

foreach ($data as $key => $value) {
    $prop = kebabToCamel($key);
    $object->$prop = $value;
}

// $object->userName, $object->createdAt でアクセスできる
PHP

こういう「橋渡し」のところに、kebabToCamel() を一つ挟むだけで、
フロントとバックエンドで命名規則が違っていても、きれいに接続できます。

設定ファイルや環境変数のキー変換

設定ファイルや .env で kebab-case を使っていて、
PHP のコード側では camelCase にしたい、というケースもあります。

$config = [
    'max-retry-count' => 3,
    'log-level'       => 'info',
];

$options = [];

foreach ($config as $key => $value) {
    $options[kebabToCamel($key)] = $value;
}

// ['maxRetryCount' => 3, 'logLevel' => 'info']
PHP

まとめ:今日からの「kebab-case → camelCase」ユーティリティ

押さえておきたいポイントをコンパクトにまとめます。

kebab-case → camelCase は、

  1. - で分割して単語にする
  2. 1つ目は小文字のまま
  3. 2つ目以降は「先頭だけ大文字+残りは小文字」
  4. くっつける

という流れで考えればよいです。

実装としては、まずはこの関数を一つプロジェクトに置いておけば十分です。

function kebabToCamel(string $kebab): string
{
    $kebab = mb_strtolower($kebab, 'UTF-8');

    $parts = explode('-', $kebab);
    $first = array_shift($parts);

    $parts = array_map(function ($part) {
        $part = mb_strtolower($part, 'UTF-8');
        $firstChar = mb_substr($part, 0, 1, 'UTF-8');
        $rest      = mb_substr($part, 1, null, 'UTF-8');
        return mb_strtoupper($firstChar, 'UTF-8') . $rest;
    }, $parts);

    return $first . implode('', $parts);
}
PHP

タイトルとURLをコピーしました