array_search($value, $array) trả về khóa của phần tử đầu tiên bằng $value, hoặc false nếu không có phần tử nào khớp. Vì khóa tìm được có thể là 0, hãy kiểm tra kết quả bằng !== false, như trong if (($key = array_search('pear', $fruits)) !== false).
Nếu bạn chỉ cần câu trả lời có hoặc không, in_array() trả lời trực tiếp. array_search() dành cho lúc bạn cần biết giá trị nằm ở đâu, chẳng hạn để thay đổi hoặc xóa nó.
Bẫy 0 với false
Bug phổ biến nhất với array_search(): giá trị là phần tử đầu tiên, khóa của nó là 0, và if ($key) coi 0 là false. Code báo "không tìm thấy" cho một giá trị nằm ngay đó. Hãy so sánh bằng !== false, phép so sánh chỉ khớp với một false thật sự.
!= false mắc cùng bug với if ($key), vì 0 == false là true. Chỉ có toán tử strict mới phân biệt được hai giá trị này.
Tìm kiếm strict
Giống in_array(), array_search() so sánh bằng == trừ khi bạn truyền true làm đối số thứ ba. Chế độ so sánh lỏng cho phép một chuỗi tìm thấy một số và null tìm thấy 0, nên hàm trả về một khóa bạn không ngờ tới.
Tìm mọi khóa có một giá trị
array_search() dừng ở kết quả khớp đầu tiên. array_keys($array, $value) trả về mọi khóa khớp dưới dạng một mảng; thêm true để so sánh strict. Kết quả rỗng nghĩa là không có gì khớp, nên không còn nhầm lẫn giữa 0 và false.
Tìm trong mảng đa chiều với array_column
array_search() không nhìn vào bên trong các mảng lồng nhau. Với một danh sách các hàng, hãy lấy trường cần tìm bằng array_column(); vị trí trong list đó khớp với số thứ tự hàng, nên kết quả chính là chỉ số của hàng.
array_column() đánh số lại kết quả từ 0, nên cách này chỉ khớp khi các hàng được đánh số 0, 1, 2 liên tục. Sau unset() hoặc array_filter(), dãy số bị khuyết; hãy chạy array_values() trên các hàng trước, hoặc dùng cách tra cứu theo khóa như ở hai dòng cuối. array_column() trình bày thêm về dạng có index key.
Tìm kiếm không phân biệt hoa thường
array_search() so sánh chuỗi một cách chính xác. Hãy chuyển cả hai bên về chữ thường để bỏ qua khác biệt hoa thường. array_map() giữ nguyên khóa, nên khóa bạn nhận được chính là khóa trong mảng gốc.
Tìm rồi thay thế hoặc xóa
Lý do thường gặp để tìm kiếm là làm gì đó với phần tử tìm được. Có khóa trong tay, hãy gán giá trị mới để thay đổi nó hoặc dùng unset() để xóa, và luôn kiểm tra bằng !== false trước: unset($arr[false]) sẽ âm thầm xóa phần tử có khóa 0.
Câu hỏi thường gặp
array_search trả về gì nếu không tìm thấy giá trị?
false. Khi tìm thấy, hàm trả về khóa của giá trị đó, và khóa có thể là 0 hoặc một chuỗi rỗng, nên hãy kiểm tra kết quả bằng !== false, không bao giờ dùng if ($key) hay != false.
Vì sao phép kiểm tra array_search của tôi sai với phần tử đầu tiên?
Phần tử đầu tiên của mảng chỉ số có khóa 0, mà 0 là falsy. Vì thế if (array_search('a', ['a', 'b'])) rơi vào nhánh không tìm thấy. Hãy viết if (array_search('a', $arr) !== false).
Làm sao tìm mọi khóa ứng với một giá trị trong PHP?
array_search() dừng ở kết quả khớp đầu tiên. array_keys($array, $value, true) trả về mọi khóa có giá trị khớp, dưới dạng một mảng (rỗng khi không có khóa nào).
Làm sao tìm kiếm trong mảng đa chiều trong PHP?
Lấy trường cần tìm ra thành một list phẳng rồi tìm trong đó: $i = array_search('ada@example.com', array_column($users, 'email'));, sau đó đọc hàng bằng $users[$i]. Cách này dùng được khi các hàng được đánh số 0, 1, 2; nếu không, hãy dùng vòng lặp foreach.