【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などの他の文字列分割関数も検討してください。
PHP strtok と explode 比較処理
1<?php 2 3/** 4 * strtok() と explode() の動作の違いを示すサンプルコード。 5 * 6 * strtok() は文字列をトークンで分割し、呼び出しごとに1つのトークンを返します。 7 * 初回は分割対象文字列とトークンを渡し、2回目以降は対象文字列に null を渡します。 8 * 9 * explode() は文字列をデリミタで分割し、結果を一度に配列で返します。 10 * これは、文字列全体を一度に分割し、結果を配列として受け取りたい場合に適しています。 11 */ 12 13// 比較対象となる文字列 14$text = "one;two;three;four"; 15// 区切り文字(トークンまたはデリミタ) 16$delimiter = ";"; 17 18echo "--- explode() の使用例 ---" . PHP_EOL; 19// explode() は文字列をデリミタで分割し、結果を配列で一度に返します。 20// 関数から返されるのは分割された部分文字列の配列です。 21$partsArray = explode($delimiter, $text); 22echo "explode() の結果 (配列): "; 23print_r($partsArray); 24echo PHP_EOL; 25 26echo "--- strtok() の使用例 ---" . PHP_EOL; 27// strtok() は文字列をトークンで分割し、呼び出しごとに1つのトークンを返します。 28// 初回呼び出し時に、分割したい元の文字列と区切り文字(トークン)を渡します。 29$token = strtok($text, $delimiter); 30 31$count = 0; 32while ($token !== false) { 33 echo "strtok() トークン " . (++$count) . ": " . $token . PHP_EOL; 34 // 2回目以降の呼び出しでは、最初の引数に null を渡します。 35 // strtok() は内部で保持している元の文字列から次のトークンを抽出します。 36 // トークンがこれ以上ない場合、false を返します。 37 $token = strtok(null, $delimiter); 38} 39 40?>
このサンプルコードは、PHP 8におけるstrtok()関数とexplode()関数の、文字列を分割する際の動作の違いを具体的に示しています。
explode()関数は、指定されたデリミタ(区切り文字)で文字列全体を一度に分割し、その結果を部分文字列の配列として返します。引数には分割したい文字列と区切り文字を渡し、戻り値は分割された部分文字列の配列です。サンプルコードでは、"one;two;three;four"という文字列を;で分割し、結果としてarray('one', 'two', 'three', 'four')という配列が得られる様子が確認できます。
一方、strtok()関数は、文字列をトークン(区切り文字)で分割しますが、explode()とは異なり、呼び出しごとに1つのトークンを順次返します。最初の呼び出しでは、分割したい元の文字列と区切り文字を引数に渡します。strtok()は、その文字列の先頭から最初のトークンを見つけて返します。2回目以降の呼び出しでは、最初の引数にnullを渡すことで、strtok()が内部で記憶している元の文字列から次のトークンを抽出し続けます。戻り値は次のトークン文字列で、これ以上トークンがない場合はfalseを返します。サンプルコードではwhileループを使い、strtok(null, $delimiter)を繰り返し呼び出してトークンを1つずつ取得する手順が示されています。
このように、explode()は文字列全体を一度に配列として取得したい場合に適しており、strtok()はメモリ効率や処理効率を考慮し、文字列からトークンを順次処理したい場合に有用です。
explode()は文字列全体を一度に分割し、結果を配列として受け取りたい場合に利用します。シンプルで直感的に扱えるのが特徴です。一方、strtok()は文字列を分割する際、呼び出しごとにトークンを一つずつ取り出す点で大きく異なります。
strtok()を初めて呼び出す際は、分割対象の文字列と区切り文字を両方渡しますが、2回目以降の呼び出しでは最初の引数にnullを渡す必要があります。これは、strtok()が内部で処理中の文字列の状態を記憶しているためです。すべてのトークンを取り終えるとfalseを返すため、ループで処理する場合は、この戻り値を適切にチェックすることが重要です。
これら二つの関数は、状況や目的によって使い分けが求められます。文字列を配列としてまとめて取得したい場合はexplode()を、大きな文字列を少しずつ処理したい場合や、メモリ使用量を抑えたい場合にstrtok()を選ぶと良いでしょう。