【PHP8.x】strtok関数の使い方
strtok関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
strtok関数は、指定された文字列を特定の区切り文字で分割し、その部分文字列(トークン)を順次取得する関数です。この関数は、ある文字列の中から意味のある単語やフレーズを抽出する際に役立ちます。
最初の呼び出しでは、分割したい元の文字列と、区切り文字として使用する文字を指定します。区切り文字は1文字だけでなく、複数の文字を組み合わせて指定することも可能です。例えば、「,」「;」「.」といった複数の文字を区切り文字として一度に指定できます。この最初の呼び出しによって、関数は内部で現在の処理位置を記憶します。
2回目以降のstrtok関数の呼び出しでは、元の文字列を再度指定する必要はなく、区切り文字のみを指定します。これにより、関数は前回の処理位置から残りの文字列を分割し、次のトークンを返します。すべての部分文字列が取得され、それ以上分割できる部分がなくなった場合、この関数はfalseを返します。
この関数は元の文字列を直接変更することはありません。また、連続する区切り文字は1つの区切り文字として扱われるため、例えば「word,,next」という文字列を「,」で分割した場合、「word」と「next」の間に空のトークンは生成されません。日本語のようなマルチバイト文字を含む文字列を扱う場合は、期待通りの動作をしないことがあるため、mb_strtokのようなマルチバイトセーフな関数を使用することを推奨します。
構文(syntax)
1<?php 2$string = "apple,banana,orange"; 3$token = strtok($string, ","); // 最初のトークンを取得 4 5while ($token !== false) { 6 echo $token . PHP_EOL; 7 $token = strtok(","); // 次のトークンを取得 8} 9?>
引数(parameters)
string $string, string $token
- string $string: 分割したい元の文字列
- string $token: 区切り文字として使用する文字列
戻り値(return)
string|false
指定された文字列 $str を、区切り文字 $token によって分割し、分割された文字列の次の部分を返します。 区切り文字が見つからない場合、または文字列の終わりに達した場合は false を返します。
サンプルコード
PHP strtokで文字列を分割する
1<?php 2 3/** 4 * strtok関数を使用して文字列を区切り文字で分割し、 5 * 各トークンを出力する例を示します。 6 * システムエンジニアを目指す初心者の方にも理解しやすいよう、 7 * 分割処理の基本的な流れを追って解説します。 8 */ 9function demonstrateStrtok(): void 10{ 11 // 分割したい元の文字列を定義します。 12 // ここでは、カンマ、セミコロン、ピリオドが区切り文字として使われています。 13 $sourceString = "Apple,Banana;Orange.Grape"; 14 15 // 文字列を分割するための区切り文字(トークン)を定義します。 16 // 複数の区切り文字をまとめて指定できます。 17 $delimiters = ",;."; 18 19 echo "元の文字列: " . $sourceString . PHP_EOL; 20 echo "使用する区切り文字: '" . $delimiters . "'" . PHP_EOL . PHP_EOL; 21 echo "--- 分割されたトークン ---" . PHP_EOL; 22 23 // strtok関数を初めて呼び出す際は、元の文字列と区切り文字の両方を指定します。 24 // これにより、strtokは元の文字列の最初の部分(トークン)を返します。 25 // 以降の呼び出しのために、strtokは内部的に元の文字列の状態を記憶します。 26 $token = strtok($sourceString, $delimiters); 27 28 // strtokがfalseを返すまで(つまり、すべてのトークンが取得されるまで)ループを続けます。 29 // falseは、残りのトークンがないことを意味します。 30 while ($token !== false) { 31 echo "取得したトークン: " . $token . PHP_EOL; 32 33 // 2回目以降のstrtokの呼び出しでは、区切り文字のみを指定します。 34 // strtokは前回の呼び出しで記憶した元の文字列から次のトークンを探します。 35 $token = strtok($delimiters); 36 } 37 echo "------------------------" . PHP_EOL; 38} 39 40// 上記の関数を実行して、strtokの動作を確認します。 41demonstrateStrtok(); 42
PHPのstrtok関数は、指定された文字列を特定の区切り文字で分割し、その一部を順次取得するために使用されます。システムエンジニアを目指す初心者の方にとって、文字列処理の基本を理解する上で役立つ関数です。
この関数は、string $stringとstring $tokenという2つの引数を受け取ります。$stringは分割したい元の文字列を指定し、$tokenは文字列を区切りたい一つまたは複数の区切り文字を指定します。戻り値は、分割された文字列の一部(トークン)が文字列として返されます。しかし、これ以上分割する部分がない場合はfalseを返します。
サンプルコードでは、"Apple,Banana;Orange.Grape"という元の文字列を、カンマ、セミコロン、ピリオドを区切り文字として分割しています。strtokを最初に呼び出す際には、元の文字列$sourceStringと区切り文字$delimitersの両方を指定します。これにより、最初のトークン"Apple"が取得され、strtokは内部的に現在の処理位置を記憶します。2回目以降の呼び出しでは、区切り文字$delimitersのみを指定することで、記憶された位置から次のトークン("Banana"、"Orange"、"Grape"など)を順に探し出し、取得します。
すべてのトークンが取得され、これ以上分割する部分がなくなると、strtokはfalseを返します。サンプルコードでは、strtokがfalseを返すまでwhileループを継続し、これにより元の文字列のすべてのトークンを順番に処理しています。このようにstrtokを使うと、文字列を効率的に分割して、各部分を簡単に取り出すことが可能です。
strtok関数は、一度元の文字列と区切り文字を指定すると、その後の呼び出しでは区切り文字のみで次の部分(トークン)を順に取得する特殊な動作をします。これは、関数が内部で現在の処理位置を記憶しているためです。そのため、複数の異なる文字列を同時にstrtokで分割しようとすると、意図しない結果になる可能性があります。分割処理は一つの文字列に対して完結させてください。
トークンがもうない場合や、初回呼び出しで元の文字列が空の場合はfalseを返します。ループでトークンを取得する際は、厳密に!== falseで判定することが重要です。また、連続する区切り文字はスキップされ、空のトークンは生成されない点も理解しておきましょう。用途に応じてexplodeなどの他の文字列分割関数も検討してください。