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つ目以降の単語は「先頭だけ大文字+残りは小文字」にする
- それらをくっつける
例えば max-retry-count なら、
['max', 'retry', 'count']に分割- 1つ目 →
max - 2つ目 →
Retry - 3つ目 →
Count - くっつけて →
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 の場合は、
-r→R-c→C
となり、結果は 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つ目以降は「先頭だけ大文字+残りは小文字」
- くっつける
という流れで考えればよいです。
実装としては、まずはこの関数を一つプロジェクトに置いておけば十分です。
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