Bạn đã có câu trả lời cho bạn biết làm thế nào để làm được việc này. Hãy để tôi chỉ thêm một câu trả lời kỹ thuật hơn lý do tại sao điều này xảy ra ....
Hành vi này bắt nguồn theo cách đặc biệt ZEND_API int compare_function(..)
hoạt động.
Khi bạn gọi in_array(needle, haystack, strict)
mà không có $ strict = true này function is used đến compareneedle
với mọi phần tử trong haystack cho đến khi tìm thấy kết quả phù hợp.
Kim của bạn là một chuỗi và các phần tử trong haystack là số nguyên.
Chúng ta hãy cùng (n viết tắt) nhìn vào compare_function()
while(1) {
switch (TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2))) {
case TYPE_PAIR(IS_LONG, IS_LONG):
ZVAL_LONG(result, Z_LVAL_P(op1)>Z_LVAL_P(op2)?1:(Z_LVAL_P(op1)<Z_LVAL_P(op2)?-1:0));
return SUCCESS;
[...more CASEs that don't apply on the first iteration of the while-loop...]
default:
[...some if-elseif cases that do not apply on the first iteration of the while-loop...]
} else {
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);
converted = 1;
}
[...]
khi mã này được exectued lần đầu tiên op1 ~ 'test'
và op2~0
. (~ có nghĩa là "gần đúng", bởi vì sự tái hiện bên trong có một chút khác biệt, nhưng nó không thực sự quan trọng ở đây.)
Nhưng không có trường hợp nào cho TYPE_PAIR (IS_STRING, IS_LONG), vì vậy nó chạm vào mặc định : chi nhánh. Có một số điều kiện if để xử lý các đối tượng, nhưng không phải toán hạng nào là một đối tượng, do đó nó nhận được phần mà các toán hạng được chuyển đổi (một lần).
Một lần nữa nếu không có điều kiện áp dụng, do đó, nó chạm vào nhánh khác cuối cùng, chuyển đổi cả hai toán hạng thành số.
'test'
được chuyển đổi thành 0
và 0
giữ nguyên 0
.
Sau đó, vòng lặp while được thực hiện lại, bây giờ với TYPE_PAIR (IS_LONG, IS_LONG) - trường hợp đầu tiên. Và bây giờ cả hai toán hạng đều bằng -> in_array() trả về giá trị true.
...và có, tôi thấy rằng khó hiểu, quá ;-)
thử sử dụng kiểm tra nghiêm ngặt 'in_array ('test', $ people, true)' – bansi