【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 * 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関数はマルチバイト文字に対応しており、期待通りの結果が得られます。