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

【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 $stringstring $tokenという2つの引数を受け取ります。$stringは分割したい元の文字列を指定し、$tokenは文字列を区切りたい一つまたは複数の区切り文字を指定します。戻り値は、分割された文字列の一部(トークン)が文字列として返されます。しかし、これ以上分割する部分がない場合はfalseを返します。

サンプルコードでは、"Apple,Banana;Orange.Grape"という元の文字列を、カンマ、セミコロン、ピリオドを区切り文字として分割しています。strtokを最初に呼び出す際には、元の文字列$sourceStringと区切り文字$delimitersの両方を指定します。これにより、最初のトークン"Apple"が取得され、strtokは内部的に現在の処理位置を記憶します。2回目以降の呼び出しでは、区切り文字$delimitersのみを指定することで、記憶された位置から次のトークン("Banana""Orange""Grape"など)を順に探し出し、取得します。

すべてのトークンが取得され、これ以上分割する部分がなくなると、strtokfalseを返します。サンプルコードでは、strtokfalseを返すまで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()を選ぶと良いでしょう。

関連コンテンツ

関連プログラミング言語