Frontend đang gọi map trên danh sách trả về từ API thì báo lỗi: dữ liệu không còn là array. Backend vẫn dùng mảng PHP, chỉ thêm bước lọc phần tử. Vấn đề có thể không nằm ở JavaScript mà ở các khóa số còn lại sau khi lọc.
1. Tái hiện bằng ba phần tử
$labels = ['Draft', 'Hidden', 'Published'];
$visible = array_filter(
$labels,
static fn (string $label): bool => $label !== 'Hidden'
);
echo json_encode($visible, JSON_THROW_ON_ERROR);
// {"0":"Draft","2":"Published"}
Theo tài liệu array_filter, hàm giữ lại khóa của phần tử được chọn. Vì vậy, mảng trên còn khóa 0 và 2, không tự đổi thành 0 và 1.
Tài liệu json_encode giải thích sự khác biệt giữa khóa số liên tiếp bắt đầu từ 0 và khóa không liên tiếp. Với cấu trúc trong ví dụ, kết quả là JSON object dù biến phía PHP vẫn có kiểu array.
2. Nếu hợp đồng là danh sách, đánh lại chỉ số
$payload = ['items' => array_values($visible)];
echo json_encode($payload, JSON_THROW_ON_ERROR);
// {"items":["Draft","Published"]}
array_values trả về các giá trị với chỉ số số nguyên mới. Trong ví dụ này, items được thiết kế là danh sách, nên việc bỏ khóa cũ là có chủ đích. Cách làm cũng cho items là [] khi không còn phần tử nào.
Đừng sửa bằng cách buộc frontend chấp nhận cả array và object nếu hợp đồng API yêu cầu một danh sách. Điều đó có thể che lỗi ở server và làm mỗi nơi tiêu thụ dữ liệu phải tự đoán định dạng.
3. Không đánh lại chỉ số của bảng tra cứu
Nếu dữ liệu là bảng tra cứu theo mã người dùng, khóa mang ý nghĩa nghiệp vụ. Bỏ chúng có thể làm mất mối liên hệ giữa mã và giá trị:
$namesById = [41 => 'Lan', 73 => 'Minh'];
// array_values($namesById) would discard IDs 41 and 73.
Trước khi thêm array_values, hãy hỏi: người nhận cần một danh sách có thứ tự hay một ánh xạ theo khóa? Nếu cần cả hai, cân nhắc danh sách bản ghi với id là trường rõ ràng thay vì giấu định danh trong vị trí của mảng.
4. Điều kiện lọc cũng cần rõ ràng
Khi bỏ callback, array_filter loại các giá trị được coi là rỗng theo quy tắc PHP. Điều này có thể loại cả số 0 và chuỗi '0', dù chúng hợp lệ trong dữ liệu của bạn. Nếu chỉ muốn bỏ null, hãy viết đúng điều kiện đó:
$values = [0, '0', null, 'Ready'];
$items = array_values(array_filter(
$values,
static fn ($value): bool => $value !== null
));
Lọc dữ liệu và định dạng danh sách là hai bước khác nhau. Kiểm tra riêng từng bước giúp tránh tình huống phản hồi đúng kiểu JSON nhưng thiếu những giá trị quan trọng.
5. Kiểm thử hình dạng dữ liệu, không chỉ số lượng
- Giữ tất cả phần tử: items vẫn là JSON array.
- Loại phần tử đầu hoặc giữa: không chuyển thành object.
- Loại toàn bộ: trả items là [], không phải null hoặc {}.
- Còn đúng một phần tử: vẫn là danh sách, không rút thành giá trị đơn.
- Dữ liệu có 0 và '0': không bị loại nếu nghiệp vụ cho phép.
- Bảng tra cứu: giữ nguyên định danh theo hợp đồng riêng.
Trong kiểm thử tích hợp, hãy kiểm tra phản hồi JSON mà client thực sự nhận. Chỉ đếm phần tử trong mảng PHP chưa đủ phát hiện việc [] biến thành {}. Các ví dụ trên dùng cú pháp PHP 7.4 trở lên; JSON_THROW_ON_ERROR giúp báo lỗi mã hóa bằng exception nhưng không tự kiểm tra hợp đồng dữ liệu.
Một bước chuẩn hóa nhỏ ở ranh giới xuất dữ liệu giúp API dễ dùng hơn, miễn là bạn xác định rõ đâu là danh sách và đâu là bảng tra cứu.




Chưa có bình luận. Hãy là người đầu tiên chia sẻ ý kiến.