まず「snake_case」と「camelCase」の違いをちゃんとイメージする
最初に、形の違いをはっきりさせましょう。
snake_case 例:
user_name
created_at
max_retry_count
camelCase 例:
userName
createdAt
maxRetryCount
snake_case は「単語を _ でつなぐスタイル」、
camelCase は「最初の単語は小文字、2単語目以降の先頭を大文字にするスタイル」です。
やりたいことはつまり、
user_name→userNamecreated_at→createdAtmax_retry_count→maxRetryCount
のように、「_ で区切られた単語列」を「camelCase」に変換することです。
DB のカラム名(snake_case)と、PHP のプロパティ名・メソッド名(camelCase)を行き来するときに、めちゃくちゃよく出てきます。
変換の考え方を分解してみる
ステップに分けるとシンプルになる
snake_case → camelCase は、次のステップに分解できます。
_で文字列を分割して、「単語の配列」にする- 1つ目の単語は全部小文字にする
- 2つ目以降の単語は「先頭だけ大文字+残りは小文字」にする
- それらをくっつける
例えば max_retry_count なら、
['max', 'retry', 'count']に分割- 1つ目 →
max - 2つ目 →
Retry - 3つ目 →
Count - くっつけて →
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 の場合:
_r→R_c→C
結果 → 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。
