Menu

Hàm explode() trong PHP: tách chuỗi thành mảng

explode(',', $string) tách một chuỗi tại mọi dấu phẩy và trả về các phần dưới dạng mảng. Tìm hiểu tham số limit, tách theo dòng, trim từng phần, và khi nào str_split hay preg_split là lựa chọn tốt hơn.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

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àmTách tạiVí dụKết quả
explode()một chuỗi phân cách cố địnhexplode('-', '2026-03-14')['2026', '03', '14']
str_split()mỗi N bytestr_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 quypreg_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().

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu