2016-01-06 16 views
5

Tại sao in_array không hoạt động trên mảng tạo từ vòng lặp php?Tại sao in_array không hoạt động trên mảng được tạo bằng cách sử dụng vòng lặp trong PHP?

mã bên dưới này hiển thị Match found.

<?php 
for ($i = 0; $i < 10; ++$i) { 
    $people[] = $i; 
}  
if (in_array('test', $people)) 
    { 
    echo "Match found"; 
    } 
else 
    { 
    echo "Match not found"; 
    } 
?> 

và mã bên dưới này hiển thị Match not found.

<?php 
$people = array("0","1","2","3","4","5","6","7","8","9"); 
if (in_array('test', $people)) 
    { 
    echo "Match found"; 
    } 
else 
    { 
    echo "Match not found"; 
    } 
?> 

Làm thế nào để giải quyết mã đầu tiên để hiển thị Match not found

+0

thử sử dụng kiểm tra nghiêm ngặt 'in_array ('test', $ people, true)' – bansi

Trả lời

2

Bạn chỉ cần thay đổi

$people[] = $i; ---by--> $people[] = "$i"; 

Sau đó bạn so sánh chuỗi

<?php 

for ($i = 0; $i < 10; ++$i) { 
    $people[] = "$i"; 

} 

if (in_array('test', $people)) 
    { 
    echo "Match found"; 
    } 
else 
    { 
    echo "Match not found"; 
    } 
?> 
7

Bởi vì trong mảng đầu tiên của bạn, bạn có số nguyên và theo mặc định in_array() hiện một non-strict type comparison, mà chỉ có một limited amount of type pairs mà nó đưa vào xem xét. Vì vậy, nó sẽ làm một diễn viên im lặng để một số nguyên với kim của bạn, mà kết quả trong 0 và nó tìm thấy nó trong mảng.

Để tránh lỗi này, chỉ cần vượt qua TRUE làm đối số thứ 3 cho in_array() để nó thực hiện strict type comparison, ví dụ:

if (in_array('test', $people, TRUE))
+1

yes và no ;-) "theo mặc định in_array() sẽ không kiểm tra loại của các yếu tố "Điều đó không đúng. Hàm so sánh mặc định cho so sánh không nghiêm ngặt vẫn tính đến các loại. Nhưng nó có một số lượng khá hạn chế của các loại cặp nó xem xét. Và mặc định là chuyển đổi cả hai toán hạng thành số => 'test'-> 0 === 0: -S – VolkerK

+0

tại sao vẫn hiển thị' Kết quả không tìm thấy' khi sử dụng mã? ' ' –

+0

@mongmongseesee Vì bây giờ bạn đã so sánh nghiêm ngặt và" 5 "! == 5' – Rizier123

2

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'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 00 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á ;-)

Các vấn đề liên quan