Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】str_split()関数の使い方

str_split関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

str_split関数は、文字列を指定したバイト数ごとに分割し、配列に変換する関数です。第1引数に対象の文字列を、第2引数に分割する各要素の長さをバイト単位で指定します。第2引数は省略可能で、省略した場合はデフォルト値の1が適用され、文字列は1バイトずつに分割されて配列の各要素に格納されます。例えば、第2引数に3を指定すると、文字列は先頭から3バイトずつの塊に分割されます。この際、最後の要素は残りのバイト数が指定した長さに満たない場合でも、その残りの文字列がそのまま格納されます。この関数を使用する上で重要な注意点は、処理が文字数ではなくバイト数に基づいている点です。そのため、UTF-8のようなマルチバイトエンコーディングが使われている日本語などの文字列に対して1以外の長さを指定すると、1つの文字が途中で分割されてしまい、文字化けを引き起こす可能性があります。マルチバイト文字を文字単位で安全に分割したい場合には、代わりにmb_str_split関数を使用することが推奨されます。関数は処理が成功すると文字列の断片を要素とする配列を返し、空の文字列が渡された場合は空の配列を返します。

構文(syntax)

1<?php
2$string = "Hello PHP";
3$array_of_characters = str_split($string);
4print_r($array_of_characters);
5
6$long_string = "Programming";
7$array_of_chunks = str_split($long_string, 3);
8print_r($array_of_chunks);
9?>

引数(parameters)

string $string, int $length = 1

  • string $string: 分割したい文字列
  • int $length = 1: 各チャンク(分割された部分)の最大長を指定する整数。デフォルトは1です。

戻り値(return)

array

指定された文字列を、指定された長さのチャンク(部分文字列)に分割した配列を返します。

サンプルコード

PHP str_splitでカンマ区切り要素を文字分割する

1<?php
2
3/**
4 * カンマ区切りの文字列を処理し、各要素を文字単位で分割する例。
5 *
6 * str_split 関数は文字列を指定された長さのチャンクに分割するもので、
7 * 特定の区切り文字(例: カンマ)で文字列を分割する機能は持ちません。
8 *
9 * このサンプルコードでは、「カンマで区切られた文字列」を処理するために、
10 * まず explode 関数を使ってカンマで文字列を分割します。
11 * その後、str_split 関数を使い、分割された各要素をさらに文字単位で分割します。
12 *
13 * @param string $csvString カンマで区切られた入力文字列
14 * @return array 各要素が文字の配列である多次元配列
15 */
16function splitCsvElementsIntoCharacters(string $csvString): array
17{
18    // 入力文字列が空の場合、または文字列ではない場合は空の配列を返す
19    if ($csvString === '') {
20        return [];
21    }
22
23    // まず、explode 関数を使ってカンマ (',') を区切り文字として文字列を分割します。
24    // 例: "apple,banana,orange" -> ["apple", "banana", "orange"]
25    $elements = explode(',', $csvString);
26
27    $result = [];
28    // 分割された各要素(例: "apple")をループ処理します。
29    foreach ($elements as $element) {
30        // str_split 関数を使って、現在の要素を文字単位に分割します。
31        // str_split のデフォルトの長さは1なので、各文字が1つの要素になります。
32        // 例: "apple" -> ["a", "p", "p", "l", "e"]
33        $result[] = str_split($element);
34    }
35
36    return $result;
37}
38
39// --- サンプルコードの実行例 ---
40
41// カンマ区切りの文字列
42$inputString = "apple,banana,orange";
43echo "元の文字列: '" . $inputString . "'\n";
44echo "結果:\n";
45print_r(splitCsvElementsIntoCharacters($inputString));
46echo "\n";
47
48// 単一の要素を持つ文字列
49$singleElement = "grape";
50echo "元の文字列: '" . $singleElement . "'\n";
51echo "結果:\n";
52print_r(splitCsvElementsIntoCharacters($singleElement));
53echo "\n";
54
55// 空の文字列
56$emptyString = "";
57echo "元の文字列: '" . $emptyString . "'\n";
58echo "結果:\n";
59print_r(splitCsvElementsIntoCharacters($emptyString));
60echo "\n";
61
62// スペースを含む要素がある文字列
63$stringWithSpaces = "  first  , second , third ";
64echo "元の文字列: '" . $stringWithSpaces . "'\n";
65echo "結果:\n";
66print_r(splitCsvElementsIntoCharacters($stringWithSpaces));
67echo "\n";

PHPのstr_split関数は、与えられた文字列を、指定された長さごとに分割し、文字の配列として返す関数です。第一引数$stringに分割したい文字列を渡し、第二引数$length(省略可能)に1つの要素が持つ文字の長さを整数で指定します。$lengthを省略した場合、デフォルトで1文字ずつ分割されます。この関数は、カンマなどの特定の区切り文字で文字列を分割する機能は持ちません。

提供されたサンプルコードは、「カンマ区切りの文字列を、各要素を文字単位で分割する」という処理を実現しています。これはstr_split関数だけでは直接行えないため、explode関数と組み合わせています。まず、explode関数を使って、入力されたカンマ区切りの文字列をカンマで個々の要素に分割します。例えば「apple,banana」であれば、最初に「apple」と「banana」という配列になります。次に、その分割された各要素をループ処理し、それぞれの要素に対してstr_split関数を適用します。これにより、「apple」が["a", "p", "p", "l", "e"]のように1文字ずつの配列に変換されます。

サンプルコード内のsplitCsvElementsIntoCharacters関数は、引数としてカンマ区切りの文字列を受け取ります。そして、戻り値として、分割された各要素がさらに文字単位で分割された配列を格納した多次元配列を返します。例えば「apple,banana」という入力に対しては、[["a", "p", "p", "l", "e"], ["b", "a", "n", "a", "n", "a"]] のような形式の配列が返されます。

このサンプルコードで利用されているstr_split関数は、文字列を指定された長さで分割するものであり、カンマなどの特定の区切り文字で文字列を分割する機能は持ちません。そのため、カンマ区切りの文字列を処理する場合は、まずexplode関数を使って文字列をカンマで分割し、その後でstr_split関数を適用する必要があります。explodeで分割した結果、各要素に不要な空白が含まれる可能性があるため、必要に応じてtrim関数で前後の空白を除去することを検討してください。また、str_split関数はマルチバイト文字(日本語など)を正しく文字単位で分割できません。マルチバイト文字を扱う場合は、代わりにmb_str_split関数を使用するようにしてください。

PHP str_split で文字列を分割する

1<?php
2
3/**
4 * 文字列を固定長または1文字ずつ配列に分割するサンプル関数。
5 * キーワード「str_split by space」を考慮し、スペースを含む文字列が
6 * str_split によってどのように分割されるかを示します。
7 * str_split 関数は、スペースも通常の文字として扱って分割します。
8 *
9 * @param string $inputString 分割対象の文字列
10 * @return void
11 */
12function demonstrateStrSplitWithSpaces(string $inputString): void
13{
14    echo "元の文字列: \"{$inputString}\"\n";
15
16    // 1文字ずつ分割(第二引数を省略したデフォルトの動作)
17    echo "\n1文字ずつ分割した結果:\n";
18    $chars = str_split($inputString);
19    echo "  [" . implode(', ', array_map(fn($char) => "'{$char}'", $chars)) . "]\n";
20    // 例: ['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', ' ', 'P', 'H', 'P']
21
22    // 3文字ずつ分割(第二引数で分割長を指定)
23    $splitLength = 3;
24    echo "\n{$splitLength}文字ずつ分割した結果:\n";
25    $chunks = str_split($inputString, $splitLength);
26    echo "  [" . implode(', ', array_map(fn($chunk) => "'{$chunk}'", $chunks)) . "]\n";
27    // 例: ['Hel', 'lo ', 'Wor', 'ld ', 'PHP']
28}
29
30// サンプル実行
31$text = "Hello World PHP";
32demonstrateStrSplitWithSpaces($text);
33

PHPのstr_split関数は、指定された文字列を文字単位、または指定した固定長で分割し、その結果を配列として返します。

この関数は二つの引数を持ちます。一つ目の$stringは分割したい元の文字列、二つ目の$lengthはオプションで、何文字ずつ分割するかを整数で指定します。$lengthを省略すると1文字ずつ分割され、戻り値は分割された各文字列が要素となる配列です。

キーワード「str_split by space」について、str_split関数はスペースも通常の文字と同様に扱って分割します。文字列中のスペースも1文字として数え、分割の対象となります。

サンプルコードでは、「Hello World PHP」という文字列で動作を示します。$lengthを省略した実行では、文字列は1文字ずつ分割され配列要素となります。$lengthに「3」を指定すると、「Hel」「lo 」「Wor」のように3文字ずつ分割され、ここでもスペースは文字としてカウントされます。残りの文字数が指定長に満たなくても、その部分が1つの要素として配列の最後に追加されます。この関数は、文字列を固定長で分割し配列にしたい場合に便利です。

str_split関数は、スペースも通常の文字として扱って分割します。キーワードの「by space」のようにスペースで文字列を区切りたい場合は、explode関数などの利用をご検討ください。

日本語などのマルチバイト文字を含む文字列を扱う場合、str_splitでは意図しない結果になる可能性があります。これはPHPが文字をバイト単位で処理することがあるためです。マルチバイト文字を正確に処理するには、PHP 7.4以降で導入されたmb_str_split関数をご利用ください。

また、第二引数で指定する分割長が文字列の長さより大きい場合、結果の配列には文字列全体が1つの要素として格納されます。分割長に0以下の値を指定すると、関数は失敗しfalseを返しますのでご注意ください。

PHP str_split UTF-8 バイト単位分割

1<?php
2
3/**
4 * PHPのstr_split()関数の使用例と、UTF-8文字列を扱う際の注意点を示します。
5 *
6 * str_split()関数は文字列をバイト単位で分割します。
7 * UTF-8文字列の場合、マルチバイト文字(例: 日本語の文字)が途中で切れる可能性があるため、
8 * 文字単位で分割したい場合は注意が必要です。
9 * PHP 7.4以降では、文字単位での分割にmb_str_split()関数が推奨されます。
10 */
11function demonstrateStrSplitWithUtf8(): void
12{
13    // 1. ASCII文字列の基本的な分割例
14    $asciiString = "Hello PHP";
15    echo "--- ASCII String Examples ---\n";
16    echo "Original: '{$asciiString}'\n";
17
18    // デフォルトの長さ (1バイト) で分割
19    echo "Split by 1 byte:\n";
20    print_r(str_split($asciiString));
21    // 期待される出力: ['H', 'e', 'l', 'l', 'o', ' ', 'P', 'H', 'P']
22
23    // 3バイトごとに分割
24    echo "\nSplit by 3 bytes:\n";
25    print_r(str_split($asciiString, 3));
26    // 期待される出力: ['Hel', 'lo ', 'PHP']
27
28    echo "\n";
29
30    // 2. UTF-8文字列でのstr_split()の挙動と注意点
31    $utf8String = "こんにちはPHP"; // 日本語のマルチバイト文字を含むUTF-8文字列
32    echo "--- UTF-8 String Examples with str_split() ---\n";
33    echo "Original UTF-8 String: '{$utf8String}'\n";
34    echo "Byte length: " . strlen($utf8String) . " bytes\n";
35    echo "Character length (UTF-8): " . mb_strlen($utf8String, 'UTF-8') . " characters\n";
36
37    // デフォルトの長さ (1バイト) で分割
38    // 各日本語文字は3バイトなので、1バイトずつ分割すると文字が途中で切れてしまいます。
39    echo "\nSplit by 1 byte (UTF-8 string):\n";
40    print_r(str_split($utf8String));
41    /*
42     * 実際の出力例(文字化けして表示されるか、バイトシーケンスとして表示されます):
43     * [
44     *     "\xe3", "\x81", "\x93", // "こ" の3バイトをそれぞれ1バイトとして分割
45     *     "\xe3", "\x82", "\x93", // "ん" の3バイトをそれぞれ1バイトとして分割
46     *     // ...続く
47     *     "P", "H", "P"
48     * ]
49     * str_split()はマルチバイト文字を考慮せず、バイト単位で処理することがわかります。
50     */
51
52    // 3バイトごとに分割
53    // 日本語文字は多くの場合3バイトなので、この場合は「文字」単位に近い結果になりますが、
54    // これはstr_split()がバイト単位で処理しているため偶然の一致です。
55    // 全てのマルチバイト文字や混在する文字列に適用できるわけではありません。
56    echo "\nSplit by 3 bytes (UTF-8 string):\n";
57    print_r(str_split($utf8String, 3));
58    /*
59     * 実際の出力例:
60     * [
61     *     "こ",
62     *     "ん",
63     *     "に",
64     *     "ち",
65     *     "は",
66     *     "PHP"
67     * ]
68     * この結果は意図した文字単位に見えますが、絵文字など4バイトの文字が含まれる場合、
69     * この方法では正しく分割できない点に注意が必要です。
70     */
71
72    // 3. UTF-8文字列を「文字」単位で正確に分割したい場合の推奨 (PHP 7.4+)
73    // mb_str_split()関数を使用すると、エンコーディングを指定して文字単位で分割できます。
74    if (function_exists('mb_str_split')) {
75        echo "\n--- Using mb_str_split() for character-based UTF-8 splitting (PHP 7.4+) ---\n";
76        echo "Split by 1 character (UTF-8 string using mb_str_split):\n";
77        print_r(mb_str_split($utf8String, 1, 'UTF-8'));
78        // 期待される出力: ['こ', 'ん', 'に', 'ち', 'は', 'P', 'H', 'P']
79    } else {
80        echo "\nNote: mb_str_split() is not available (requires PHP 7.4+).";
81        echo " For older PHP versions, consider using mb_substr() in a loop for character-based splitting.\n";
82    }
83}
84
85// サンプル関数の実行
86demonstrateStrSplitWithUtf8();

PHP 8のstr_split関数は、指定された文字列をバイト単位で分割し、その部分文字列を要素とする配列を返します。引数として、分割対象のstring $stringと、分割するバイト長を整数で指定するint $length(デフォルトは1)を受け取ります。戻り値は分割された部分文字列のarrayです。

例えば、"Hello PHP"のようなASCII文字列をstr_split("Hello PHP")で実行すると、各文字が1バイトのため['H', 'e', 'l', 'l', 'o', ' ', 'P', 'H', 'P']のように文字単位で分割されます。str_split("Hello PHP", 3)のようにすると、['Hel', 'lo ', 'PHP']と3バイトずつ分割されます。

ただし、str_split関数は文字列を常にバイト単位で処理するため、「こんにちはPHP」のようなUTF-8のマルチバイト文字列を扱う際には注意が必要です。日本語の文字は通常3バイトであるため、str_split("こんにちはPHP", 1)のように1バイト単位で分割すると、各日本語文字が途中で切れてしまい、意図しないバイトシーケンスや文字化けした結果が返される可能性があります。

UTF-8文字列を「文字」単位で正確に分割したい場合は、PHP 7.4以降で利用可能なmb_str_split関数を使用することが推奨されます。mb_str_split("こんにちはPHP", 1, 'UTF-8')のようにエンコーディングを指定することで、['こ', 'ん', 'に', 'ち', 'は', 'P', 'H', 'P']のように正しく文字単位で分割することができます。str_splitがバイト単位の処理であるのに対し、mb_str_splitはエンコーディングを考慮した文字単位の処理である点を理解することが重要です。

str_split関数は、文字列を「バイト単位」で分割する点に注意が必要です。特にUTF-8文字列(日本語など)を扱う場合、マルチバイト文字が途中で切れてしまい、予期せぬ結果や文字化けの原因となることがあります。これは、日本語の多くが3バイト以上で構成されるため、1バイトや特定のバイト数で分割すると、1つの文字が複数に分解されてしまうためです。例えば、偶然3バイトで分割しても、絵文字のような4バイトの文字には正しく対応できません。UTF-8文字列を「文字単位」で正確に分割したい場合は、PHP 7.4以降で導入されたmb_str_split関数を利用することを強く推奨します。この関数はエンコーディングを指定できるため、マルチバイト文字を安全に扱えます。

PHP str_split 日本語バイト分割の挙動

1<?php
2
3/**
4 * str_split 関数の使用例:日本語文字列の分割
5 *
6 * str_split 関数は、文字列をバイト単位で指定された長さに分割します。
7 * そのため、日本語のようなマルチバイト文字を含む文字列に対して使用すると、
8 * 意図した「文字」単位ではなく「バイト」単位で分割されるため、文字化けや不完全な文字になることがあります。
9 *
10 * PHP 7.4 以降では、マルチバイト文字列を正しく文字単位で分割するために `mb_str_split` 関数が提供されています。
11 * このサンプルコードは、str_split の挙動を理解するためのものであり、
12 * 日本語文字列を正しく分割する推奨方法ではありません。
13 *
14 * @param string $string 分割する文字列(日本語を含む)
15 * @param int $length 分割するバイト数(デフォルトは1バイト)
16 * @return void
17 */
18function demonstrateStrSplitWithJapanese(string $string, int $length = 1): void
19{
20    echo "元の文字列: " . $string . "\n";
21    echo "指定バイト数: " . $length . "\n\n";
22
23    // str_split を使用して文字列をバイト単位で分割
24    $splitResult = str_split($string, $length);
25
26    echo "str_split の結果:\n";
27    // 結果を var_dump で表示し、配列の内容を詳しく確認
28    var_dump($splitResult);
29
30    echo "\n--- 解説 ---\n";
31    echo "上記の通り、str_split はバイト単位で分割するため、\n";
32    echo "日本語の1文字(UTF-8では通常3バイト)が途中で分割され、\n";
33    echo "期待通りの「文字」ごとの配列にはなりません。\n";
34    echo "日本語などのマルチバイト文字列を正しく文字単位で分割するには、\n";
35    echo "PHP 7.4 以降で提供されている mb_str_split 関数を使用してください。\n";
36    echo "例: mb_str_split('こんにちは', 1);\n";
37}
38
39// 日本語文字列を準備
40$japaneseText = "こんにちは世界";
41
42// 1バイトずつ分割した場合の例
43echo "--- 1バイトずつ分割した結果 ---\n";
44demonstrateStrSplitWithJapanese($japaneseText, 1);
45echo "\n";
46
47// 3バイトずつ分割した場合の例(UTF-8の日本語1文字が3バイトの場合に対応)
48// ただし、全ての日本語文字が正確に3バイトとは限らない点に注意
49echo "--- 3バイトずつ分割した結果 ---\n";
50demonstrateStrSplitWithJapanese($japaneseText, 3);
51

PHPのstr_split関数は、指定された文字列を、指定されたバイト数ごとに分割し、その結果を文字列の配列として返します。第一引数$stringには分割したい元の文字列を、第二引数$lengthには分割するバイト数を整数で指定します。$lengthのデフォルト値は1です。戻り値は、分割された部分文字列を含む配列(array)となります。

しかし、str_split関数は文字列を「バイト単位」で処理します。このため、サンプルコードのように日本語のようなマルチバイト文字を含む文字列に対して使用すると、期待通りの結果が得られないことがあります。日本語の1文字はUTF-8エンコーディングの場合、通常3バイトで構成されるため、str_splitで分割すると、文字の途中で切れてしまい、文字化けや不完全な文字となる可能性があります。

日本語などのマルチバイト文字列を正しく「文字単位」で分割したい場合には、PHP 7.4以降で提供されているmb_str_split関数を使用することが推奨されます。str_splitはシングルバイト文字の分割に適しており、日本語の文字単位での分割にはmb_str_splitを利用してください。

PHPのstr_split関数は、文字列をバイト単位で指定された長さに分割します。このため、日本語のように複数のバイトで構成されるマルチバイト文字を含む文字列に対して使用すると、意図した「文字」単位ではなく「バイト」単位で分割されてしまい、文字化けや不完全な文字になる可能性があります。このサンプルコードはstr_splitの挙動を理解するためのものであり、日本語文字列を正しく分割する推奨方法ではありません。日本語などのマルチバイト文字列を文字単位で安全に分割したい場合は、PHP 7.4以降で提供されているmb_str_split関数を使用してください。mb_str_split関数はマルチバイト文字に対応しており、期待通りの結果が得られます。

関連コンテンツ

関連プログラミング言語