PHP Tips | 文字列処理:変換系 – snake_case → camelCase

PHP PHP
スポンサーリンク

まず「snake_case」と「camelCase」の違いをちゃんとイメージする

最初に、形の違いをはっきりさせましょう。

snake_case 例:
user_name
created_at
max_retry_count

camelCase 例:
userName
createdAt
maxRetryCount

snake_case は「単語を _ でつなぐスタイル」、
camelCase は「最初の単語は小文字、2単語目以降の先頭を大文字にするスタイル」です。

やりたいことはつまり、

user_nameuserName
created_atcreatedAt
max_retry_countmaxRetryCount

のように、「_ で区切られた単語列」を「camelCase」に変換することです。

DB のカラム名(snake_case)と、PHP のプロパティ名・メソッド名(camelCase)を行き来するときに、めちゃくちゃよく出てきます。


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

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

snake_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

この流れをコードに落とし込めばOKです。


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

snake_case を camelCase に変換する関数

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

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

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

    // 先頭の単語(あれば)を取り出す
    $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 snakeToCamel('user_name');        // userName
echo snakeToCamel('created_at');       // createdAt
echo snakeToCamel('max_retry_count');  // maxRetryCount
echo snakeToCamel('id');               // id
PHP

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


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

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

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

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

snakeToCamel('USER_NAME');
PHP

小文字化しない場合:

  • 分割 → ['USER', 'NAME']
  • 2つ目を「先頭だけ大文字」にしても、もともと全部大文字なので NAME のまま
  • 結果 → USERNAME(camelCase じゃない)

小文字化する場合:

  • 小文字化 → user_name
  • 分割 → ['user', 'name']
  • 2つ目 → Name
  • 結果 → userName(期待どおり)

つまり、

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

なら、最初に小文字にそろえるのが必須です。

マルチバイト対応をしている理由

mb_strtolower / mb_strtoupper / mb_substr を使っているのは、
UTF-8 前提で「変な壊れ方」をしないようにするためです。

snake_case / camelCase は基本的に英字だけで使うことが多いですが、
実務では「たまに日本語やアクセント付き文字が混ざる」こともあります。

  • 英字だけなら strtolower / strtoupper / substr でも動く
  • でも、プロジェクト全体を UTF-8 で統一するなら、最初から mb_* に寄せておく方が安全

という判断です。


もう少しコンパクトに書くバージョン

ロジックが見えたら、短くも書ける

やっていることが理解できたら、こんな書き方もできます。

function snakeToCamel(string $snake): string
{
    $snake = mb_strtolower($snake, 'UTF-8');

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

これは、

  • _ のあとに続く英小文字1文字を探す
  • それを大文字に置き換える

という発想です。

max_retry_count の場合:

  • _rR
  • _cC

結果 → maxRetryCount

ただし、正規表現に慣れていないと読みにくいので、
初心者向け・チーム開発では、さっきの「explode して map する」版の方が好まれやすいです。


実務での使いどころ

DB カラム名 → PHP のプロパティ名

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

  • DB カラム:user_name
  • PHP プロパティ:$userName
$row = [
    'id'         => 1,
    'user_name'  => 'Taro',
    'created_at' => '2026-01-27 10:00:00',
];

$object = new stdClass();

foreach ($row as $column => $value) {
    $prop = snakeToCamel($column);
    $object->$prop = $value;
}

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

こういう「マッピング処理」の中に snakeToCamel() を一つ挟むだけで、
コード側の名前を camelCase に統一できます。

API レスポンスのキー変換

外部APIが snake_case で返してくるけれど、
自分のアプリ内では camelCase で扱いたい、というケースもよくあります。

$response = [
    'user_id'    => 1,
    'user_name'  => 'Taro',
    'created_at' => '2026-01-27T10:00:00Z',
];

$converted = [];

foreach ($response as $key => $value) {
    $converted[snakeToCamel($key)] = $value;
}

// ['userId' => 1, 'userName' => 'Taro', 'createdAt' => ...]
PHP

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

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

  • snake_case → camelCase は、「_ で分割 → 1単語目は小文字、2単語目以降の先頭を大文字」にすればよい。
  • 入力の大文字・小文字がバラバラでもきれいにしたいなら、最初に全部小文字にそろえるのが重要。
  • UTF-8 前提なら、mb_strtolower / mb_strtoupper / mb_substr を使っておくと安心。
  • DB カラム名や API のキーを、PHP 内部の camelCase にそろえるときに、ユーティリティとしてめちゃくちゃ役に立つ。

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

function snakeToCamel(string $snake): string
{
    $snake = mb_strtolower($snake, 'UTF-8');

    $parts = explode('_', $snake);
    $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をコピーしました