PHPでlengthを取得する方法
PHPで文字列や配列の「length(長さ)」を取得する場合は、対象となるデータの種類によって使用する関数が異なります。
JavaScriptでは文字列や配列に対して .length を使用しますが、PHPの標準的な文字列や配列には、JavaScriptの .length に相当する共通プロパティはありません。
PHPでは主に、次の関数を使い分けます。
strlen($string); // 文字列のバイト数
mb_strlen($string, "UTF-8"); // 文字列の文字数
count($array); // 配列の要素数
特に日本語を含む文字列では、strlen() と mb_strlen() の違いを理解しておくことが重要です。
PHPではデータ型によってlengthの取得方法が異なる
PHPで長さを調べる際の基本的な使い分けは、次のとおりです。
| 対象 | 使用する関数 | 取得できる値 |
|---|---|---|
| 文字列 | strlen() | バイト数 |
| 日本語などを含む文字列 | mb_strlen() | 文字数 |
| 配列 | count() | 要素数 |
| 配列 | sizeof() | 要素数 |
| Unicode文字列 | grapheme_strlen() | 書記素クラスタ単位の長さ |
一般的なPHPプログラミングでは、まず strlen()、mb_strlen()、count() の3つを覚えておけば、多くのケースに対応できます。
文字列のlengthをstrlen()で取得する
PHPで文字列の長さを取得する代表的な関数が strlen() です。
ただし、strlen() が返すのは厳密には文字数ではなく、文字列の「バイト数」です。
strlen()の基本的な使い方
strlen() は次のように使用します。
$text = "Hello";
echo strlen($text);
実行結果は次のとおりです。
5
Hello は5バイトなので、5 が返されます。
半角英数字などのASCII文字は通常1文字につき1バイトであるため、ASCII文字だけで構成された文字列では、バイト数と文字数が一致することが多くあります。
例えば次のコードです。
$text = "Hello PHP";
echo strlen($text);
結果は次のようになります。
9
Hello が5バイト、半角スペースが1バイト、PHP が3バイトなので、合計9バイトです。
strlen()は日本語の文字数取得には注意が必要
日本語を含むUTF-8文字列に strlen() を使用すると、一般的に想定する「文字数」とは異なる値が返されます。
例えば次のコードです。
$text = "こんにちは";
echo strlen($text);
UTF-8では、この文字列は一般的に15バイトとなるため、結果は次のようになります。
15
「こんにちは」は5文字ですが、ここで数えられているのは文字数ではなくバイト数です。
そのため、日本語の入力文字数を確認したい場合などに strlen() を使用すると、想定より大きな値になることがあります。
なお、「日本語1文字は必ず3バイト」というわけではありません。
UTF-8ではUnicodeのコードポイントによって使用するバイト数が異なります。
一般的なひらがなや多くの漢字が3バイトになるため、「こんにちは」の場合は15バイトになると考えると分かりやすいでしょう。
日本語の文字数はmb_strlen()で取得する
日本語などのマルチバイト文字を含む文字列について、「何文字あるのか」を取得したい場合は mb_strlen() を使用するのが一般的です。
mb_strlen()の基本的な使い方
例えば次のように記述します。
$text = "こんにちは";
echo mb_strlen($text, "UTF-8");
実行結果は次のとおりです。
5
mb_strlen() は指定された文字エンコーディングを考慮して文字列を数えるため、日本語も1文字として扱うことができます。
strlen()とmb_strlen()の違い
両者の違いは、同じ日本語文字列で比較すると分かりやすくなります。
$text = "こんにちは";
echo strlen($text);
echo "\n";
echo mb_strlen($text, "UTF-8");
一般的なUTF-8環境では、次のような結果になります。
15
5
つまり、基本的には次のように使い分けます。
strlen($text); // バイト数
mb_strlen($text, "UTF-8"); // 文字数
日本語のフォーム入力や記事タイトルの文字数制限などでは、通常 mb_strlen() の方が適しています。
英数字と日本語が混在している場合
例えば次の文字列を考えてみます。
$text = "PHP入門";
strlen() を使用すると、一般的なUTF-8環境では次のようになります。
echo strlen($text);
結果は次のとおりです。
9
PHP が3バイトで、「入」「門」がそれぞれ3バイトなので、合計9バイトです。
一方、mb_strlen() を使用すると次のようになります。
echo mb_strlen($text, "UTF-8");
結果は次のとおりです。
5
P、H、P、入、門 の5文字として数えられます。
文字エンコーディングを指定できる
mb_strlen() の第2引数では、文字エンコーディングを指定できます。
例えばUTF-8の場合は次のようにします。
$text = "東京都";
$length = mb_strlen($text, "UTF-8");
echo $length;
結果は次のとおりです。
3
WebサイトでUTF-8を使用しているのであれば、次のように明示しておくとコードの意図も分かりやすくなります。
mb_strlen($text, "UTF-8");
第2引数を省略した場合は、PHPの内部文字エンコーディングが使用されます。
mb_strlen()を使用するにはmbstring拡張が必要
mb_strlen() はPHPのmbstring拡張に含まれる関数です。
環境によっては、mbstring拡張を有効化する必要があります。
使用可能かどうかは、次のように確認できます。
if (function_exists("mb_strlen")) {
echo mb_strlen("こんにちは", "UTF-8");
}
多くの一般的なPHP環境では利用できますが、サーバー構成によっては確認が必要です。
配列のlengthはcount()で取得する
PHPで配列の要素数を取得する場合は、count() を使用します。
JavaScriptにおける array.length に近い役割を持つ関数です。
count()の基本的な使い方
例えば次の配列があるとします。
$fruits = [
"apple",
"banana",
"orange"
];
echo count($fruits);
実行結果は次のとおりです。
3
配列に3つの要素が含まれているためです。
変数に保存することもできます。
$users = [
"Tanaka",
"Suzuki",
"Sato"
];
$length = count($users);
echo $length;
結果は次のとおりです。
3
連想配列でもcount()を使用できる
count() は、通常の添字配列だけでなく連想配列でも利用できます。
$user = [
"name" => "Tanaka",
"age" => 30,
"email" => "example@example.com"
];
echo count($user);
実行結果は次のようになります。
3
name、age、email の3つの要素があるためです。
空の配列では0を返す
空配列に count() を使用すると 0 が返されます。
$items = [];
echo count($items);
結果は次のとおりです。
0
そのため、次のように要素が存在するかを確認することもできます。
if (count($items) === 0) {
echo "データがありません";
}
単純に配列が空かどうかを確認するだけなら、empty() を使用する方法もあります。
if (empty($items)) {
echo "データがありません";
}
PHP 8以降でcount()を使用するときの注意点
PHP 8以降では、count() に配列でも Countable オブジェクトでもない値を渡すと TypeError が発生します。
例えば次のようなコードです。
count("Hello");
または、
count(null);
このような値をそのまま渡すことはできません。
外部データなどで型が不明な場合は、事前に確認すると安全です。
is_array()で確認する
配列かどうかだけを確認する場合は、次のように記述できます。
if (is_array($value)) {
echo count($value);
}
is_countable()で確認する
配列だけでなく Countable オブジェクトも含めて確認したい場合は、is_countable() が便利です。
if (is_countable($value)) {
echo count($value);
}
PHP 8系を利用する場合は、この仕様を理解しておくとエラーを防ぎやすくなります。
sizeof()でも配列の要素数を取得できる
PHPには sizeof() という関数もあります。
$fruits = [
"apple",
"banana",
"orange"
];
echo sizeof($fruits);
結果は次のとおりです。
3
sizeof() は count() のエイリアスなので、基本的な動作は同じです。
ただし、配列の要素数を数える処理であることが分かりやすいため、通常は count() を使う方が一般的です。
多次元配列のlengthを取得する方法
多次元配列で count() を使用するときは、通常のカウントと再帰的なカウントの違いに注意する必要があります。
通常のcount()は最上位の要素を数える
例えば次の配列があります。
$users = [
[
"name" => "Tanaka",
"age" => 30
],
[
"name" => "Suzuki",
"age" => 25
]
];
echo count($users);
結果は次のようになります。
2
最上位には2つのユーザー配列が存在するためです。
内部にある name や age まで自動的に数えるわけではありません。
COUNT_RECURSIVEで再帰的に数える
count() の第2引数に COUNT_RECURSIVE を指定すると、内部の配列も含めて再帰的に数えられます。
$array = [
["PHP", "JavaScript"],
["HTML", "CSS"]
];
echo count($array, COUNT_RECURSIVE);
結果は次のようになります。
6
この場合は、
外側の要素数:2
内側の要素数:4
合計:6
として数えられます。
そのため、COUNT_RECURSIVE は「一番深い階層の値だけを数える機能」ではありません。
通常のデータ件数を取得する場合は、単純な count($array) を使うケースが多いでしょう。
配列の最後のインデックスを求めるときの注意点
配列の要素数が分かると、次のように最後のインデックスを求めたくなる場合があります。
$lastIndex = count($array) - 1;
キーが 0 から連続している配列では、この方法でも問題ありません。
例えば、
$fruits = [
"apple",
"banana",
"orange"
];
echo count($fruits) - 1;
結果は次のとおりです。
2
しかし、PHPの配列では数値キーが連続しているとは限りません。
例えば次の配列です。
$array = [
10 => "apple",
20 => "banana",
30 => "orange"
];
この配列に対して、
echo count($array);
とすると結果は 3 ですが、最後のキーは 30 です。
つまり、
count($array) - 1
で得られる 2 は、最後のキーではありません。
PHPの配列では、「要素数」と「最後のキー」は別物として考える必要があります。
文字列が空かどうかをlengthで判定する方法
文字列の長さを利用して、空文字かどうかを判定することもできます。
$text = "";
if (strlen($text) === 0) {
echo "空文字です";
}
ただし、単純に空文字 "" だけを判定したい場合は、次の書き方の方が意図が明確です。
if ($text === "") {
echo "空文字です";
}
empty()では”0″にも注意する
empty() を使った空判定も可能ですが、PHPでは文字列 "0" も空とみなされます。
$text = "0";
var_dump(empty($text));
結果は次のとおりです。
bool(true)
そのため、「完全な空文字列だけを判定したい」という場合は、
$text === ""
のように厳密比較を使用する方が安全です。
フォームの文字数チェックでmb_strlen()を使う
lengthを取得する処理は、Webフォームの入力チェックでもよく利用されます。
例えば、ユーザー名を20文字以内に制限する場合は次のようにできます。
$username = "山田太郎";
if (mb_strlen($username, "UTF-8") > 20) {
echo "ユーザー名は20文字以内で入力してください";
}
日本語入力が可能なフォームで strlen() を使ってしまうと、文字数ではなくバイト数で判定されるため、意図した制限にならない可能性があります。
そのため、日本語を含む可能性がある入力値では mb_strlen() を使うのが基本です。
絵文字の文字数を取得するときの注意点
mb_strlen() は日本語などのマルチバイト文字を正しく扱えますが、人間が画面上で「1文字」と認識する単位と必ずしも一致するとは限りません。
Unicodeでは、複数のコードポイントを組み合わせて1つの絵文字や記号を表現するケースがあるためです。
grapheme_strlen()を使用する方法
ユーザーが認識する「見た目上の1文字」に近い単位で数えたい場合は、grapheme_strlen() を利用できます。
$length = grapheme_strlen($text);
一般的な日本語Webサイトのフォームで文字数を数えるだけであれば mb_strlen() で十分な場合が多いですが、絵文字を厳密に扱うサービスなどでは grapheme_strlen() も検討するとよいでしょう。
JavaScriptのlengthとPHPの違い
JavaScriptでは、文字列や配列に .length を使用できます。
const text = "Hello";
console.log(text.length);
const fruits = ["apple", "banana", "orange"];
console.log(fruits.length);
PHPでは同じように共通の .length を使うのではなく、データの種類ごとに関数を使い分けます。
$text = "Hello";
echo strlen($text);
$fruits = ["apple", "banana", "orange"];
echo count($fruits);
日本語の文字数であれば次のようにします。
$text = "こんにちは";
echo mb_strlen($text, "UTF-8");
PHPでは、「何の長さを数えたいのか」を意識して関数を選ぶことが重要です。
PHPでlengthを取得する方法の使い分け
PHPでlengthに相当する値を取得する場合は、基本的に次のように使い分けます。
文字列のバイト数を取得する場合
$text = "Hello";
echo strlen($text);
ASCII文字列やバイト数そのものを確認したい場合に使用します。
日本語を含む文字列の文字数を取得する場合
$text = "こんにちは";
echo mb_strlen($text, "UTF-8");
日本語の文字数制限や入力チェックでは、こちらを使用するのが一般的です。
配列の要素数を取得する場合
$array = [
"apple",
"banana",
"orange"
];
echo count($array);
配列のデータ件数や要素数を調べる場合に使用します。
まとめ
PHPで文字列や配列のlengthを取得するときは、JavaScriptのように共通の .length プロパティを使うのではなく、対象に応じて関数を使い分けます。
特に覚えておきたいのは、次の3つです。
strlen($string); // 文字列のバイト数
mb_strlen($string, "UTF-8"); // 文字列の文字数
count($array); // 配列の要素数
strlen() は文字数ではなくバイト数を取得するため、日本語を含むUTF-8文字列では、一般的な意味での文字数とは異なる結果になることがあります。
日本語などを含む文字列の文字数を調べる場合は mb_strlen() を使用するのが基本です。
一方、配列の要素数を取得する場合は count() を使用します。
また、PHP 8以降では count() に配列や Countable 以外の値を渡すと TypeError が発生するため、型が不明なデータでは is_array() や is_countable() で確認すると安全です。
PHPでlengthを扱う際は、**「バイト数なら strlen()、文字数なら mb_strlen()、配列の要素数なら count()」**と覚えておくと、適切に使い分けやすくなります。
以上、PHPで文字列や配列のlengthを取得する方法についてでした。
最後までお読みいただき、ありがとうございました。










