explode($separator, $string) tách một chuỗi tại mọi vị trí xuất hiện của $separator và trả về các phần dưới dạng mảng. explode(',', 'apple,banana,cherry') cho ra ['apple', 'banana', 'cherry'].
Ký tự phân cách có thể là chuỗi bất kỳ, không chỉ một ký tự: explode(' and ', 'tea and milk and sugar') cũng hoạt động theo cách đó. Thao tác ngược lại, nối một mảng trở lại thành chuỗi, là implode().
Cú pháp và giá trị trả về
explode(string $separator, string $string, int $limit = PHP_INT_MAX): array
Hàm luôn trả về một mảng. Nếu ký tự phân cách không xuất hiện, mảng chứa cả chuỗi làm phần tử duy nhất. Điều này đúng cả với chuỗi rỗng, cho ra một mảng chứa một chuỗi rỗng, nguồn gốc quen thuộc của bug "vòng lặp chạy một lần dù đầu vào rỗng".
Giới hạn số phần
Đối số thứ ba, $limit, thay đổi số phần bạn nhận được:
- Limit dương trả về tối đa chừng đó phần. Phần cuối chứa toàn bộ phần còn lại của chuỗi, kể cả các ký tự phân cách.
- Limit âm trả về mọi phần trừ
abs($limit)phần cuối. - Limit bằng
0được coi là1.
Limit dương là công cụ phù hợp khi chỉ ký tự phân cách đầu tiên là quan trọng, ví dụ một dòng key=value mà giá trị cũng có thể chứa =: explode('=', 'query=a=b', 2) cho ra ['query', 'a=b']. Các phần tiếp theo dùng nó theo cách đó.
Để chỉ lấy phần cuối, hãy lưu mảng vào một biến trước: $parts = explode('/', $path); $file = end($parts);. Viết end(explode('/', $path)) vẫn trả về đúng giá trị, nhưng PHP in ra Notice: Only variables should be passed by reference, vì end() nhận đối số theo tham chiếu.
Tách chuỗi theo dòng
explode("\n", $text) tách tại các dấu xuống dòng. Hãy dùng nháy kép: trong nháy đơn, '\n' là một dấu gạch chéo ngược theo sau là chữ n, không phải ký tự xuống dòng. Văn bản từ tệp Windows hoặc form HTML thường kết thúc dòng bằng "\r\n", để lại một ký tự "\r" thừa ở cuối mỗi phần. preg_split('/\R/', $text) tách tại mọi kiểu xuống dòng.
Trim từng phần và bỏ phần rỗng
Dữ liệu người dùng nhập như "red, green , ,blue" có khoảng trắng quanh các mục và một mục rỗng ở giữa. Hãy đưa các phần qua trim() bằng array_map(), rồi loại bỏ chuỗi rỗng bằng array_filter(). Sau đó array_values() đánh số lại các khóa, vì array_filter() giữ nguyên khóa ban đầu.
Callback fn($c) => $c !== '' giữ lại chuỗi "0". Một lời gọi array_filter($colors) trơn sẽ loại bỏ nó, vì "0" là falsy.
Biến chuỗi thành mảng kết hợp
Cấu hình, cookie và những chuỗi giống query string thường được lưu dưới dạng các cặp key=value. Hãy explode hai lần: một lần cho các cặp, một lần cho từng cặp với limit là 2, rồi giải nén hai phần vào các biến (destructuring mảng).
Một cặp không có =, như debug, cho ra mảng một phần tử, và phép destructuring in ra Warning: Undefined array key 1. Hãy bổ sung kết quả cho đủ hai phần tử để tránh điều đó: [$key, $value] = explode('=', $pair, 2) + [1 => ''];.
Với query string thật của một URL, parse_str() làm việc này giúp bạn và còn giải mã cả %20 lẫn +.
Tách theo nhiều ký tự phân cách
explode() chỉ nhận một ký tự phân cách. Để tách tại dấu phẩy, dấu chấm phẩy hoặc khoảng trắng, hãy dùng preg_split() với một lớp ký tự. PREG_SPLIT_NO_EMPTY bỏ đi các phần rỗng sinh ra khi hai ký tự phân cách đứng liền nhau.
Tiếng Nhật và văn bản UTF-8 khác
explode() so sánh theo byte, và trong UTF-8 một ký tự hoàn chỉnh không bao giờ xuất hiện bên trong các byte của ký tự khác, nên tách văn bản tiếng Nhật tại một ký tự phân cách tiếng Nhật như 、 hay dấu phẩy toàn chiều rộng vẫn chạy đúng.
explode, str_split và preg_split
| Hàm | Tách tại | Ví dụ | Kết quả |
|---|---|---|---|
explode() | một chuỗi phân cách cố định | explode('-', '2026-03-14') | ['2026', '03', '14'] |
str_split() | mỗi N byte | str_split('abcdef', 2) | ['ab', 'cd', 'ef'] |
mb_str_split() | mỗi N ký tự | mb_str_split('日本語') | ['日', '本', '語'] |
preg_split() | một biểu thức chính quy | preg_split('/\s+/', 'a b') | ['a', 'b'] |
explode() không xử lý regex nên nhanh hơn preg_split(), và là hàm nên dùng mỗi khi ký tự phân cách là một chuỗi cố định.
Lỗi thường gặp: ký tự phân cách rỗng
Ký tự phân cách rỗng là một lỗi. Từ PHP 8.0, explode('', 'abc') ném ra ValueError thay vì trả về false, và script dừng lại:
PHP Fatal error: Uncaught ValueError: explode(): Argument #1 ($separator) cannot be empty in /home/index.php:3
Để tách chuỗi thành từng ký tự, hãy dùng str_split('abc') cho văn bản ASCII hoặc mb_str_split($s) cho mọi văn bản có thể chứa ký tự nhiều byte.
Câu hỏi thường gặp
explode() trong PHP làm gì?
Nó tách một chuỗi tại mọi vị trí xuất hiện của ký tự phân cách và trả về các phần dưới dạng mảng: explode(',', 'a,b,c') trả về ['a', 'b', 'c']. Bản thân ký tự phân cách không nằm trong phần nào.
explode() trả về gì nếu không tìm thấy ký tự phân cách?
Một mảng có một phần tử là cả chuỗi: explode(',', 'apple') trả về ['apple']. Chuỗi rỗng cho ra [''], một mảng chứa một chuỗi rỗng, nên count() trả về 1, không phải 0.
Làm sao tách chuỗi theo nhiều ký tự phân cách trong PHP?
Dùng preg_split() với một lớp ký tự: preg_split('/[,;|]/', $s) tách tại dấu phẩy, dấu chấm phẩy và dấu gạch đứng. Để bỏ luôn các phần rỗng, truyền limit là -1 cùng cờ: preg_split('/[,;|]/', $s, -1, PREG_SPLIT_NO_EMPTY).
explode() và str_split() khác nhau thế nào?
explode() tách tại một ký tự phân cách do bạn chọn. str_split($s, 3) cắt chuỗi thành các đoạn có độ dài cố định, tính theo byte. Với tiếng Việt, tiếng Nhật hay văn bản nhiều byte khác, hãy dùng mb_str_split($s), hàm này đếm theo ký tự.
Vì sao explode() ném ra ValueError?
Vì ký tự phân cách là chuỗi rỗng. Từ PHP 8.0, explode('', $s) ném ra ValueError: explode(): Argument #1 ($separator) cannot be empty. Để tách chuỗi thành từng ký tự, hãy dùng str_split() hoặc mb_str_split().