explode() 是 PHP 分割字串為陣列的核心函式。自 PHP 5.1 起,limit 參數支援負數,提供「從右側移除 N 個元素」的強大功能。本文詳細解析三種 limit 模式的行為差異與實戰場景。
array explode ( string $separator, string $string [, int $limit = PHP_INT_MAX ] )
| limit 值 | 行為 | 結果陣列長度 | 適用場景 |
|---|---|---|---|
| 正數 (N > 0) | 從左至右分割,最多回傳 N 個元素;最後一個元素包含剩餘字串 | ≤ N | 只需前幾段資料,如解析 URL 路徑前段 |
| 負數 (N < 0) | 從右側移除 |N| 個元素,回傳剩餘前段元素 | 總數 - |N| (若總數 ≤ |N| 回傳空陣列) | 移除尾部固定欄位,如去除 CSV 尾部備註欄 |
| 0 或未提供 | 全部分割,無限制 | 所有分割段 | 標準分割需求 |
<?php
$str = "1 2 3 4 5 6";
// limit = -2:從右側移除 2 個元素 (5, 6)
print_r(explode(" ", $str, -2));
/*
Array (
[0] => 1
[1] => 2
[2] => 3
[3] => 4
)
*/
// 更多範例
$csv = "name,age,city,country,remark1,remark2";
print_r(explode(",", $csv, -2)); // 移除最後兩欄 remark
/*
Array (
[0] => name
[1] => age
[2] => city
[3] => country
)
*/
// 邊界情況:分割段數少於 |limit|
$short = "a,b";
print_r(explode(",", $short, -3)); // 總段數 2 < 3,回傳空陣列
/* Array() */
<?php
// 日誌格式:時間 IP 方法 路徑 狀態碼 大小 參考頁 UA
$log = '2024-01-15 10:30:45 192.168.1.1 GET /api/user 200 1024 "-" "Mozilla/5.0"';
// 只需前 5 欄核心資訊,移除最後 3 欄 (大小、參考頁、UA)
$parts = explode(" ", $log, -3);
// 結果:['2024-01-15', '10:30:45', '192.168.1.1', 'GET', '/api/user', '200']
// 進階:處理 UA 可能包含空格,先用 preg_split 限制分割次數
$parts = preg_split('/\s+/', $log, 8); // 最多分 8 段,UA 保持完整
$core = array_slice($parts, 0, -3); // 移除最後 3 段
?>
explode() 比 preg_split() 快 3-5 倍,優先使用。preg_split()。explode() 對大字串效能顯著優化。負數 limit 僅支援 PHP 5.1.0+。極舊版本(已淘汰)不支援,若需相容可用 array_slice(explode(...), 0, -N) 替代。