+3

array_slice Trong PHP: Nghệ Thuật "Cắt Bánh" Không Làm Vỡ Form

Câu chuyện thực tế: Bạn gọi API sang hệ thống của đối tác để lấy danh sách 100 bài báo mới nhất. Ngặt nỗi, API của họ "đời tống", không hề hỗ trợ phân trang (Pagination). Nó ném thẳng một mảng bự chảng 100 phần tử vào mặt bạn. Nhiệm vụ của bạn là lấy ra đúng 10 bài báo cho Trang 2 (tức là từ bài số 11 đến 20) để trả về cho Frontend.

Những anh em mới học code sẽ hì hục tạo một mảng rỗng $result = [], rồi viết vòng lặp for ($i = 10; $i < 20; $i++), sau đó array_push từng cái vào. Trông rất cực nhọc!

Một Vibe Coder sẽ chỉ dùng đúng 1 dòng:

$result = array_slice($articles, 10, 10);

Hôm nay chúng ta sẽ giải phẫu hàm cắt bánh nghệ thuật này.

1. Cấu trúc của lưỡi dao: array_slice

Hàm này nhận vào 4 tham số, trong đó 2 tham số đầu là bắt buộc:

array_slice(array $array, int $offset, ?int $length = null, bool $preserve_keys = false)

  • $array: Cái mảng gốc mà bạn muốn đem ra cắt.
  • $offset: Nhát dao đầu tiên. Đặt dao ở vị trí số mấy để bắt đầu cắt?
  • $length: Độ dài miếng bánh. Cắt thêm bao nhiêu phần tử kể từ nhát dao đầu?
  • $preserve_keys: Kỹ thuật giữ lại dĩa đựng bánh (Sẽ nói rõ ở phần 3).

2. Sự vi diệu của số Âm (Negative Values)

Nếu chỉ gõ số dương array_slice($arr, 2, 3) (Bắt đầu từ index 2, lấy 3 phần tử) thì quá bình thường. Sức mạnh thực sự của hàm này nằm ở việc nó hiểu số âm.

Trường hợp 1: $offset là số âm (Cắt từ dưới lên)

Bạn muốn lấy 3 phần tử cuối cùng của mảng mà không thèm đếm xem mảng dài bao nhiêu?

$arr = ['A', 'B', 'C', 'D', 'E'];
// Offset -3 nghĩa là: Đếm ngược từ dưới lên 3 bước, rồi lấy hết về bên phải.
$result = array_slice($arr, -3); 
// Kết quả: ['C', 'D', 'E']

Trường hợp 2: $length là số âm (Chừa lại phần đuôi)

Bạn muốn lấy từ index 1, và bỏ đi 2 phần tử cuối cùng của mảng?

$arr = ['A', 'B', 'C', 'D', 'E', 'F'];
// Cắt từ index 1 ('B'), và dừng nhát dao cách cái đuôi 2 phần tử.
$result = array_slice($arr, 1, -2);
// Kết quả: ['B', 'C', 'D']

3. Cạm bẫy "Mất Form": Tại sao index của tôi lại bị reset?

Đây là chỗ nhiều anh em "đổ máu" nhất. Hãy nhìn đoạn code sau:

$users = [
    5 => 'Tèo',
    6 => 'Tí',
    7 => 'Cu'
];

// Cắt lấy 2 người đầu tiên
$sliced = array_slice($users, 0, 2);

Bạn đinh ninh kết quả sẽ là [5 => 'Tèo', 6 => 'Tí']?

SAI! Kết quả trả về sẽ tự động bị reset index (đánh số lại từ 0):

[0 => 'Tèo', 1 => 'Tí']

Mặc định, array_slice sẽ xóa bỏ các key dạng số (Numeric keys) và sắp xếp lại từ 0. Nếu bạn đang dùng key đó làm User_ID để update Database thì... chúc mừng bạn đã phá hỏng dữ liệu!

Giải pháp: Bật lá chắn $preserve_keys = true (Tham số thứ 4).

$sliced = array_slice($users, 0, 2, true); // Kết quả an toàn: [5 => 'Tèo', 6 => 'Tí']

(Lưu ý: Nếu key của bạn là Chuỗi (String key) như mảng kết hợp, thì array_slice luôn luôn giữ nguyên key, không cần quan tâm tham số thứ 4 này).

4. Trải nghiệm cắt mảng trực quan

Để dễ hình dung hơn cách $offset$length chạy như thế nào, đặc biệt là khi dùng số âm

image.png

https://www.w3schools.com/php/phptryit.asp?filename=tryphp_func_array_slice

Lời kết

array_slice là một hàm chỉ mang tính chất Đọc (Non-destructive). Nó tạo ra một mảng mới và trả về cho bạn, mảng gốc ban đầu không hề bị ảnh hưởng. Điều này rất tốt cho việc giữ trạng thái an toàn trong ứng dụng. Hãy nắm vững nó để code Backend mượt mà hơn nhé.

Chủ đề tiếp theo: array_splice - Lưỡi Dao Phẫu Thuật Gây Chảy Máu Của PHP

Nếu array_slice hiền lành bao nhiêu, thì người anh em sinh đôi của nó là array_splice (thêm chữ "p") lại bạo lực bấy nhiêu.

Bạn muốn cắt bỏ 2 phần tử ở giữa mảng, và LẬP TỨC nhét 3 phần tử mới vào đúng chỗ đó? array_splice làm được. NHƯNG, nó là hàm Destructive – nó sẽ thay đổi và tàn phá trực tiếp mảng gốc của bạn. Xài không khéo là bay luôn data gốc.

Ở bài viết tới, chúng ta sẽ mổ xẻ sự khác biệt sống còn giữa Slice và Splice, cũng như cách vá mảng cực xịn nhé! Anh em đón đọc!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí