| 特性 | strtok() | explode() |
|---|---|---|
| 分割符 | 多個單字元分隔符 | 單一字串分隔符 |
| 記憶體 | 流式處理,省記憶體 | 一次產生整個陣列 |
| 控制權 | 迴圈中可動態改分隔符、中斷 | 一次性完成 |
| 中文支援 | 不支援多位元組分隔符 | 支援 |
// 首次呼叫需傳入字串與分隔符 $token = strtok($string, $delimiters); // 後續呼叫只需傳入分隔符(可改變) $token = strtok($newDelimiters); // 回傳 false 表示結束
$string = "This is\ta\nstring";
$tok = strtok($string, " \n\t"); // 空格、換行、Tab
while ($tok !== false) {
echo "$tok\n";
$tok = strtok(" \n\t");
}
/* 輸出:
This
is
an
example
string
*/
$string = "這是PHP論壇 論壇版塊 論壇欄目 論壇H管理員 論壇會員";
$tok = strtok($string, " H"); // 初始:空格 + H
$n = 1;
while ($tok !== false) {
echo "$tok\n";
if ($n++ > 2) break; // 任意中斷
$tok = strtok(" "); // 之後只用空格分割
}
/* 輸出:
這是P
P 論壇
論壇版塊
*/
$line = "leon\tatkinson\tleon@clearink.com";
for ($token = strtok($line, "\t"); $token !== false; $token = strtok("\t")) {
echo "token: $token\n";
}
/* 輸出:
token: leon
token: atkinson
token: leon@clearink.com
*/
$data = "id:123|name:John|role:admin;id:456|name:Jane|role:user";
// 第一層分割:記錄分隔符 ;
$record = strtok($data, ';');
while ($record !== false) {
// 第二層分割:欄位分隔符 |
$field = strtok($record, '|');
$row = [];
while ($field !== false) {
// 第三層:鍵值分隔符 :
[$key, $val] = explode(':', $field, 2);
$row[$key] = $val;
$field = strtok('|');
}
echo json_encode($row) . "\n";
$record = strtok(';');
}
/* 輸出:
{"id":"123","name":"John","role":"admin"}
{"id":"456","name":"Jane","role":"user"}
*/
strtok('', '') 可重置內部狀態// PHP 8.0+ 推薦:strtok 替代品
// 1. 簡單分割
$parts = explode('|', $string);
// 2. 正則分割(支援多字元、Unicode)
$parts = preg_split('/[\s,;|]+/u', $string);
// 3. 迭代器模式(大字串、記憶體友善)
function tokenIterator(string $string, string $delimiters): Generator {
$token = strtok($string, $delimiters);
while ($token !== false) {
yield $token;
$token = strtok($delimiters);
}
}
foreach (tokenIterator($bigString, ',') as $token) { /* ... */ }
strtok() 適合:記憶體敏感、需動態控制分割流程、單字元分隔符 的場景。現代專案多改用 explode()、preg_split() 或 Generator 迭代器,程式碼更清晰且支援 Unicode。