array_slice($array, $offset, $length) trả về một mảng mới gồm $length phần tử, bắt đầu từ vị trí $offset. Mảng gốc không bị thay đổi. Bỏ $length đi để lấy mọi phần tử đến hết mảng.
Offset là vị trí (0 là phần tử đầu tiên), không phải khóa. Điều này quan trọng với mảng kết hợp và với những mảng có khóa không phải 0, 1, 2.
Lấy N phần tử cuối bằng offset âm
Offset âm đếm từ cuối mảng: -1 là phần tử cuối cùng, -3 bắt đầu từ phần tử thứ ba tính từ cuối. Length âm thì dừng lại trước cuối mảng đúng chừng ấy phần tử.
Xin nhiều phần tử hơn số đang có cũng không sao: array_slice($log, 0, 100) trả về cả năm phần tử.
Giữ nguyên khóa gốc với preserve_keys
Khóa số nguyên được đánh số lại từ 0, trừ khi bạn truyền true làm đối số thứ tư. Khóa chuỗi thì luôn được giữ.
Dùng true khi khóa mang ý nghĩa, chẳng hạn id trong cơ sở dữ liệu, và sau này bạn sẽ tra phần tử theo khóa đó.
Phân trang mảng với array_slice
Hiển thị trang $page của một danh sách có $perPage mục mỗi trang chỉ cần một lần cắt: offset là ($page - 1) * $perPage. Ví dụ này in ra một danh sách HTML kèm liên kết các trang. Chạy thử rồi bấm vào một số trang: cùng đoạn script đó chạy lại với $_GET['page'] lấy từ liên kết.
Dòng max(1, min($pages, ...)) giữ cho một giá trị gõ tay như ?page=99 hay ?page=-1 nằm trong khoảng hợp lệ. Với cơ sở dữ liệu, bạn sẽ chỉ truy vấn một trang bằng LIMIT và OFFSET thay vì tải mọi hàng, nhưng với một danh sách đã có sẵn trong bộ nhớ thì array_slice làm trọn việc.
array_slice và array_splice
Tên hai hàm chỉ khác nhau một chữ cái nhưng chúng làm điều ngược nhau với mảng gốc. array_slice sao chép một phần ra ngoài. array_splice cắt phần đó khỏi chính mảng bạn truyền vào, đánh số lại mảng và trả về các phần tử đã bị xóa. Hàm này còn có thể chèn phần tử thay thế vào chỗ vừa cắt.
array_slice | array_splice | |
|---|---|---|
| Thay đổi mảng gốc | không | có (theo tham chiếu) |
| Trả về | phần được chọn | phần bị xóa |
| Chèn được phần tử | không | có, đối số thứ tư |
| Khóa số nguyên | đánh số lại, trừ khi có preserve_keys | đánh số lại |
Để biết thêm cách xóa phần tử, xem trang xóa phần tử khỏi mảng.
Chia mảng thành các nhóm
Khi cần tất cả các trang cùng lúc, chẳng hạn để xếp sản phẩm thành từng hàng ba món, array_chunk làm giúp bạn việc cắt lặp đi lặp lại.
Đổi 3 thành 2 hoặc 4 rồi chạy lại. Nhóm cuối cùng chứa những phần tử còn dư.
Câu hỏi thường gặp
Làm sao lấy N phần tử đầu tiên của mảng trong PHP?
array_slice($arr, 0, 3) trả về ba phần tử đầu tiên. Nếu mảng có ít hơn ba phần tử, bạn nhận được tất cả mà không gặp lỗi nào.
Làm sao lấy N phần tử cuối cùng của mảng?
Dùng offset âm: array_slice($arr, -3) trả về ba phần tử cuối. Bỏ qua length nghĩa là "lấy đến hết mảng".
preserve_keys trong array_slice dùng để làm gì?
Mặc định array_slice đánh số lại các khóa số nguyên từ 0. Truyền true làm đối số thứ tư, array_slice($arr, 2, 3, true), để giữ nguyên khóa số nguyên ban đầu. Khóa chuỗi thì luôn được giữ, dù có truyền hay không.
array_slice và array_splice khác nhau thế nào?
array_slice trả về bản sao một phần của mảng và không đụng đến mảng gốc. array_splice nhận mảng theo tham chiếu, xóa phần đó khỏi mảng (có thể chèn phần tử thay thế vào) và trả về phần đã xóa.