function in_array() trong PHP: Cách kiểm tra phần tử có trong mảng
Lập trình PHP

function in_array() trong PHP: Cách kiểm tra phần tử có trong mảng

Chào mừng bạn đến với chuỗi bài viết "Tìm hiểu các Function trong PHP"! Hôm nay, chúng ta sẽ cùng nhau khám phá một hàm cực kỳ hữu ích và được sử dụng rất nhiều trong lập trình PHP: in_array(). Đừng lo lắng nếu bạn là người mới bắt đầu, tôi sẽ giải thích mọi thứ một cách đơn giản nhất, dễ hiểu như đang nói chuyện với một bạn nhỏ 10 tuổi vậy!

1. in_array() là gì? Nó sinh ra để làm gì?

Hãy tưởng tượng bạn có một hộp đồ chơi (chính là mảng trong PHP) chứa rất nhiều món đồ chơi khác nhau như xe ô tô, búp bê, gấu bông, và robot. Bây giờ, bạn muốn biết liệu món đồ chơi "xe ô tô" có đang nằm trong hộp đồ chơi của bạn hay không. Thay vì phải lục tung cả hộp lên, bạn có thể hỏi một "trợ lý" đặc biệt để giúp bạn kiểm tra. "Trợ lý" đó chính là hàm in_array() trong PHP!

Về cơ bản, in_array() là một hàm giúp bạn kiểm tra xem một giá trị cụ thể có tồn tại bên trong một mảng hay không. Nó sẽ trả lời cho bạn biết "có" (TRUE) hoặc "không" (FALSE).

Cú pháp của in_array()

Cú pháp của hàm in_array() khá đơn giản:

in_array(mixed $needle, array $haystack, bool $strict = false): bool
  • $needle: Đây là giá trị mà bạn muốn tìm kiếm (ví dụ: "xe ô tô" trong hộp đồ chơi).
  • $haystack: Đây là mảng mà bạn muốn tìm kiếm bên trong (ví dụ: hộp đồ chơi của bạn).
  • $strict (Tùy chọn): Đây là một tham số đặc biệt, bạn có thể coi nó như một "quy tắc nghiêm ngặt" khi tìm kiếm.
    • Nếu bạn đặt $stricttrue (mặc định là false), hàm sẽ kiểm tra cả giá trịkiểu dữ liệu của $needle có khớp với phần tử trong $haystack hay không.
    • Nếu bạn đặt $strictfalse, hàm chỉ kiểm tra giá trị mà thôi.

Hãy xem một ví dụ để dễ hình dung hơn nhé!

<?php

$mon_do_choi_trong_hop = ["xe ô tô", "búp bê", "gấu bông", "robot"];

// Ví dụ 1: Kiểm tra xem "xe ô tô" có trong hộp không?
if (in_array("xe ô tô", $mon_do_choi_trong_hop)) {
    echo "Có, xe ô tô đang ở trong hộp!";
} else {
    echo "Không, không có xe ô tô trong hộp.";
}
// Kết quả: Có, xe ô tô đang ở trong hộp!

echo "<br>";

// Ví dụ 2: Kiểm tra xem "máy bay" có trong hộp không?
if (in_array("máy bay", $mon_do_choi_trong_hop)) {
    echo "Có, máy bay đang ở trong hộp!";
} else {
    echo "Không, không có máy bay trong hộp.";
}
// Kết quả: Không, không có máy bay trong hộp.

?>

Thật đơn giản phải không nào? Hàm in_array() giúp chúng ta kiểm tra sự tồn tại của một phần tử trong mảng một cách nhanh chóng và hiệu quả.

2. Đi sâu hơn về tham số $strict (Quy tắc nghiêm ngặt)

Như đã đề cập ở trên, tham số $strict có vai trò quan trọng trong việc tìm kiếm. Hãy cùng tìm hiểu kỹ hơn về nó.

Khi $strictfalse (mặc định)

Khi bạn không cung cấp tham số $strict hoặc đặt nó là false, PHP sẽ chỉ so sánh giá trị của $needle với các phần tử trong $haystack. Điều này có nghĩa là, nếu bạn tìm số 1 trong một mảng có chuỗi "1", in_array() vẫn sẽ trả về true vì giá trị của chúng là như nhau, mặc dù kiểu dữ liệu khác nhau (số và chuỗi).

<?php

$so_may_man = [1, 2, "3", 4];

// Tìm số 3 (kiểu số nguyên) trong mảng có chuỗi "3"
if (in_array(3, $so_may_man)) {
    echo "Có, số 3 có trong mảng (so sánh lỏng lẻo).";
} else {
    echo "Không, số 3 không có trong mảng (so sánh lỏng lẻo).";
}
// Kết quả: Có, số 3 có trong mảng (so sánh lỏng lẻo).
// Vì 3 (int) được coi là bằng "3" (string) khi so sánh lỏng lẻo.

?>

Khi $stricttrue

Khi bạn đặt $stricttrue, PHP sẽ thực hiện một cuộc kiểm tra nghiêm ngặt hơn. Nó sẽ so sánh cả giá trịkiểu dữ liệu của $needle với các phần tử trong $haystack. Nếu cả giá trị và kiểu dữ liệu đều giống nhau, hàm mới trả về true.

<?php

$so_may_man = [1, 2, "3", 4];

// Tìm số 3 (kiểu số nguyên) trong mảng có chuỗi "3" với so sánh nghiêm ngặt
if (in_array(3, $so_may_man, true)) { // Đặt strict là true
    echo "Có, số 3 có trong mảng (so sánh nghiêm ngặt).";
} else {
    echo "Không, số 3 không có trong mảng (so sánh nghiêm ngặt).";
}
// Kết quả: Không, số 3 không có trong mảng (so sánh nghiêm ngặt).
// Vì 3 (int) không cùng kiểu dữ liệu với "3" (string), nên không được coi là giống nhau.

echo "<br>";

// Tìm chuỗi "3" (kiểu chuỗi) trong mảng có chuỗi "3" với so sánh nghiêm ngặt
if (in_array("3", $so_may_man, true)) { // Đặt strict là true
    echo "Có, chuỗi '3' có trong mảng (so sánh nghiêm ngặt).";
} else {
    echo "Không, chuỗi '3' không có trong mảng (so sánh nghiêm ngặt).";
}
// Kết quả: Có, chuỗi '3' có trong mảng (so sánh nghiêm ngặt).
// Vì "3" (string) cùng kiểu dữ liệu với "3" (string), nên được coi là giống nhau.

?>

Lời khuyên: Hầu hết thời gian, bạn nên sử dụng $strict = true để tránh những lỗi không mong muốn do so sánh kiểu dữ liệu không chính xác. Điều này giúp code của bạn minh bạch và đáng tin cậy hơn.

3. Các ví dụ thực tế về in_array()

Hãy cùng xem một vài tình huống thực tế mà bạn có thể sử dụng in_array():

Ví dụ 1: Kiểm tra quyền truy cập

Giả sử bạn có một danh sách các vai trò (roles) mà một người dùng có thể có, và bạn muốn kiểm tra xem người dùng hiện tại có vai trò "admin" hay không.

<?php

$quyen_nguoi_dung = ["editor", "viewer", "admin"];

if (in_array("admin", $quyen_nguoi_dung)) {
    echo "Người dùng này có quyền admin. Chào mừng quản trị viên!";
} else {
    echo "Người dùng này không có quyền admin.";
}
// Kết quả: Người dùng này có quyền admin. Chào mừng quản trị viên!

?>

Ví dụ 2: Kiểm tra một sản phẩm có trong giỏ hàng không

<?php

$gio_hang = ["Áo sơ mi", "Quần jean", "Giày thể thao", "Mũ lưỡi trai"];

$san_pham_moi = "Quần jean";

if (in_array($san_pham_moi, $gio_hang)) {
    echo "'{$san_pham_moi}' đã có trong giỏ hàng của bạn.";
} else {
    echo "'{$san_pham_moi}' chưa có trong giỏ hàng. Bạn có muốn thêm vào không?";
    // Thêm sản phẩm vào giỏ hàng...
}
// Kết quả: 'Quần jean' đã có trong giỏ hàng của bạn.

?>

Ví dụ 3: Kiểm tra đầu vào hợp lệ từ người dùng

<?php

$phuong_thuc_thanh_toan_hop_le = ["tien_mat", "chuyen_khoan", "the_tin_dung"];

$phuong_thuc_khach_hang_chon = "chuyen_khoan";

if (in_array($phuong_thuc_khach_hang_chon, $phuong_thuc_thanh_toan_hop_le)) {
    echo "Phương thức thanh toán '{$phuong_thuc_thuc_khach_hang_chon}' hợp lệ.";
} else {
    echo "Phương thức thanh toán '{$phuong_thuc_thuc_khach_hang_chon}' không hợp lệ. Vui lòng chọn lại.";
}
// Kết quả: Phương thức thanh toán 'chuyen_khoan' hợp lệ.

?>

4. in_array() so với các hàm khác: Khi nào nên dùng gì?

Bạn có thể thắc mắc, liệu có cách nào khác để kiểm tra sự tồn tại của phần tử trong mảng không? Vâng, có một số cách khác, nhưng in_array() thường là lựa chọn tối ưu cho việc này.

in_array() vs. array_search()

  • in_array(): Chỉ kiểm tra sự tồn tại và trả về true hoặc false.
  • array_search(): Cũng kiểm tra sự tồn tại, nhưng nếu tìm thấy, nó sẽ trả về khóa (key) của phần tử đó trong mảng. Nếu không tìm thấy, nó trả về false.

Khi nào dùng gì?

  • Dùng in_array() khi bạn chỉ cần biết "có hay không có".
  • Dùng array_search() khi bạn cần biết thêm vị trí của phần tử nếu nó tồn tại.
<?php

$cac_mon_hoa_qua = ["táo", "cam", "chuối", "xoài"];

// Dùng in_array()
if (in_array("chuối", $cac_mon_hoa_qua)) {
    echo "Có chuối trong danh sách hoa quả.";
}

echo "<br>";

// Dùng array_search()
$vi_tri_chuoi = array_search("chuối", $cac_mon_hoa_qua);
if ($vi_tri_chuoi !== false) { // Dùng !== false vì array_search có thể trả về 0 (là một khóa hợp lệ)
    echo "Chuối nằm ở vị trí thứ: {$vi_tri_chuoi} (tính từ 0).";
} else {
    echo "Không tìm thấy chuối.";
}

?>

in_array() vs. isset()empty() (cho mảng kết hợp)

isset()empty() thường được dùng để kiểm tra sự tồn tại của khóa (key) trong mảng, đặc biệt là mảng kết hợp (associative array), chứ không phải giá trị.

<?php

$thong_tin_sinh_vien = [
    "ma_sv" => "SV001",
    "ten" => "Nguyen Van A",
    "tuoi" => 20
];

// Kiểm tra khóa "ten" có tồn tại không
if (isset($thong_tin_sinh_vien["ten"])) {
    echo "Có thông tin tên sinh viên.";
}

echo "<br>";

// Kiểm tra giá trị "Nguyen Van A" có tồn tại trong mảng không (dùng in_array)
if (in_array("Nguyen Van A", $thong_tin_sinh_vien)) {
    echo "Có sinh viên tên Nguyen Van A trong danh sách.";
}

?>

5. Hiệu suất của in_array()

Về mặt hiệu suất, in_array() là một hàm khá hiệu quả cho hầu hết các trường hợp sử dụng. Đối với các mảng có kích thước nhỏ đến trung bình, bạn sẽ không thấy bất kỳ vấn đề hiệu suất nào đáng kể.

Tuy nhiên, khi làm việc với các mảng cực lớn (hàng trăm nghìn hoặc hàng triệu phần tử), việc tìm kiếm tuyến tính (linear search) mà in_array() sử dụng có thể trở nên chậm. Trong những trường hợp đó, bạn có thể cân nhắc các cấu trúc dữ liệu khác như sử dụng khóa của mảng kết hợp để mô phỏng "set" (tập hợp) nếu bạn chỉ cần kiểm tra sự tồn tại, hoặc sử dụng cơ sở dữ liệu để tìm kiếm dữ liệu lớn.

Ví dụ, nếu bạn cần kiểm tra sự tồn tại của hàng triệu ID, việc lưu trữ chúng trong một mảng kết hợp với ID là khóa sẽ nhanh hơn nhiều:

<?php

// Cách không tối ưu cho mảng lớn:
$ds_id_lon_array = range(1, 1000000); // Mảng có 1 triệu ID
// Nếu bạn tìm 999999, in_array phải duyệt gần hết mảng

// Cách tối ưu hơn cho mảng lớn (sử dụng mảng kết hợp):
$ds_id_lon_key = [];
for ($i = 1; $i <= 1000000; $i++) {
    $ds_id_lon_key[$i] = true; // Giá trị không quan trọng, chỉ cần khóa
}

$id_can_tim = 999999;

// Tìm kiếm với in_array (sẽ chậm hơn với mảng lớn)
$start_time_array = microtime(true);
if (in_array($id_can_tim, $ds_id_lon_array)) {
    // echo "Tìm thấy ID trong mảng thường.";
}
$end_time_array = microtime(true);
echo "Thời gian tìm kiếm (in_array): " . ($end_time_array - $start_time_array) . " giây<br>";

// Tìm kiếm với mảng kết hợp (rất nhanh)
$start_time_key = microtime(true);
if (isset($ds_id_lon_key[$id_can_tim])) {
    // echo "Tìm thấy ID trong mảng kết hợp.";
}
$end_time_key = microtime(true);
echo "Thời gian tìm kiếm (isset trên mảng kết hợp): " . ($end_time_key - $start_time_key) . " giây<br>";

?>

(Lưu ý: Kết quả thời gian có thể khác nhau tùy môi trường chạy, nhưng bạn sẽ thấy sự khác biệt đáng kể về hiệu suất.)

6. Lịch sử và sự thay đổi của in_array() qua các phiên bản PHP

Hàm in_array() là một hàm cốt lõi và ổn định của PHP. Nó đã tồn tại từ rất lâu và không có sự thay đổi lớn nào về chức năng qua các phiên bản. Điều này có nghĩa là bạn hoàn toàn có thể yên tâm sử dụng nó mà không lo lắng về việc bị loại bỏ trong tương lai.

Dưới đây là bảng đối chiếu các phiên bản PHP và trạng thái của hàm in_array():


| Phiên bản PHP | Trạng thái hàm in_array() | Ghi chú | | :------------ | :-------------------------- | :------ | | PHP 5.2 | Có sẵn | Hoạt động bình thường. | | PHP 5.3 | Có sẵn | Hoạt động bình thường. | | PHP 5.4 | Có sẵn | Hoạt động bình thường. | | PHP 5.5 | Có sẵn | Hoạt động bình thường. | | PHP 5.6 | Có sẵn | Hoạt động bình thường. | | PHP 7.0 | Có sẵn | Hoạt động bình thường. | | PHP 7.1 | Có sẵn | Hoạt động bình thường. | | PHP 7.2 | Có sẵn | Hoạt động bình thường. | | PHP 7.3 | Có sẵn | Hoạt động bình thường. | | PHP 7.4 | Có sẵn | Hoạt động bình thường. | | PHP 8.0 | Có sẵn | Hoạt động bình thường. | | PHP 8.1 | Có sẵn | Hoạt động bình thường. | | PHP 8.2 | Có sẵn | Hoạt động bình thường. | | PHP 8.3 | Có sẵn | Hoạt động bình thường. |


Như bạn có thể thấy, in_array() là một hàm cực kỳ bền vững và đã được duy trì ổn định qua rất nhiều phiên bản PHP. Đây là một trong những lý do khiến nó trở thành lựa chọn đáng tin cậy cho các lập trình viên.

7. Tổng kết và lời khuyên

Hàm in_array() là một công cụ mạnh mẽ và không thể thiếu khi làm việc với mảng trong PHP. Nó giúp bạn dễ dàng kiểm tra xem một giá trị có tồn tại trong mảng hay không, tiết kiệm thời gian và công sức.

Những điểm chính cần nhớ:

  • in_array($needle, $haystack, $strict): Tìm kiếm $needle trong $haystack.
  • Tham số $strict: Đặt là true để so sánh cả giá trị và kiểu dữ liệu. Đây là khuyến nghị cho hầu hết các trường hợp.
  • in_array() chỉ trả về true hoặc false, nếu bạn cần vị trí của phần tử, hãy dùng array_search().
  • Hiệu suất tốt cho mảng vừa và nhỏ. Với mảng cực lớn, cân nhắc sử dụng mảng kết hợp (isset()) để tối ưu hóa.
  • Hàm in_array() đã có mặt và ổn định trong mọi phiên bản PHP từ rất sớm đến hiện tại, không cần lo lắng về tính tương thích.

Hy vọng qua bài viết này, bạn đã hiểu rõ về cách sử dụng hàm in_array() và có thể áp dụng nó vào các dự án của mình một cách hiệu quả.


Tài liệu tham khảo thêm:

Kelvin Zeng

Senior Website Developer

👨‍💻 Senior PHP Developer, hiện đảm nhận vai trò Techlead. Tôi có kinh nghiệm làm việc trong môi trường công ty Nhật Bản, từng tham gia thiết kế tài liệu kỹ thuật (Basic Design, Detail Design) và lập kế hoạch dự án với vai trò như một Project Lead. Trong sự nghiệp, tôi đã tham gia xây dựng và triển khai nhiều hệ thống E-commerce cũng như làm việc với nhiều framework khác nhau. Ngoài lập trình, tôi quan tâm đến SEO, automation và marketing, đặc biệt yêu thích việc phát triển các công cụ giúp tối ưu công việc. Tôi luôn sẵn sàng chia sẻ kiến thức, đồng hành cùng đồng đội để nâng cao chuyên môn và đạt được những mục tiêu lớn hơn.