2012-07-16 42 views
6

PHP luôn luôn trả về false khi tôi sử dụng in_array(), và cho dù đó là hay không nằm trong mảng không quan trọng. Ví dụ:PHP in_array() luôn trả về false

$list = 'test 
list 
example'; 
$list_arr = array(); 
$list_arr = explode("\n",$list); 
if (in_array('test',$list_arr)) { 
    echo 'Found'; 
} 
else { 
    echo 'Not Found'; 
} 

Returns 'Not Found' dù 'test' là một giá trị trong mảng

$list = 'test 
list 
example'; 
$list_arr = array(); 
$list_arr = explode("\n",$list); 
if (in_array('qwerty',$list_arr)) { 
    echo 'Found'; 
} 
else { 
    echo 'Not Found'; 
} 

Returns 'Not Found', như nó phải

Tại sao nó trở về sai khi nó phải là sự thật? Vui lòng đưa ra bất kỳ đề xuất nào. Danh sách tôi thực sự sử dụng có hơn 10 nghìn giá trị và do đó tôi chỉ rút ngắn nó ở đây.

+0

Bạn đang sử dụng hệ điều hành nào? Trong cửa sổ, một dòng cuối cùng thực sự là hai ký tự: \ r \ n, do đó, tách nó trên \ n sẽ cung cấp cho bạn 'văn bản \ r', 'danh sách \ r' và 'ví dụ'. –

+0

bạn có chắc chắn bạn có '\ n' chứ không phải' \ r \ n'? –

+0

Bạn có thể 'var_dump ($ list_arr);' và đăng đầu ra không? – MrGlass

Trả lời

9

Nếu bạn đang sử dụng ví dụ này chính xác và được mã hóa trên máy tính Windows, vấn đề xuất phát từ thực tế là các cửa hàng của Windows dòng nguồn cấp dữ liệu sử dụng:

\r\n 

Vì vậy, khi bạn chia trên \ n chỉ bạn giữ một phần tử vô hình ở cuối mục của bạn và chúng không phù hợp với lý do đó.

+0

Tôi đang trên linux, tuy nhiên điều đó đã khắc phục được sự cố –

+0

Nó có thể được định cấu hình trong trình chỉnh sửa, không nên là notepad – Esailija

+0

Tôi sử dụng Notepad ++ để mã php của mình –

8

Danh sách của bạn thực sự được phân tách bằng \r\n, không chỉ \n.

$list_arr = explode("\r\n",$list); 
+0

Đánh tôi với nó bằng những gì ... 4 giây? –

+0

Phải, và khi bạn tách biệt bằng "\ r", bạn kết thúc bằng "text \ r" làm chuỗi - vì vậy hãy thử đặt nó trong 'in_array()' chỉ để xem. – Ariel

+0

@MathieuDumoulin: Tôi là một ninja: P –

0

Như đã nêu, Windows sử dụng \ r \ n làm ký tự cuối dòng. Sử dụng Unix \ n và Mac sử dụng \ r. Để tạo mã di động, hãy sử dụng hằng số PHP_EOL để giải mã chuỗi của bạn:

$list_arr = explode(PHP_EOL, $list) 

Bằng cách đó, bạn chắc chắn nó luôn hoạt động chính xác.

+0

Không đúng, vì Windows sẽ lưu trữ EOL dưới dạng \ r \ n nhưng nếu bạn chạy nó trên một máy tính Linux, nó sẽ \ n chỉ: http: //ca3.php. net/manual/en/reserved.constants.php –

+0

@MathieuDumoulin liên kết được cung cấp không nêu rõ điều đó. Nó chỉ nói "ký tự cuối cùng của dòng" cho nền tảng. Giải pháp của tôi sẽ không hoạt động nếu bạn sử dụng trình soạn thảo kết thúc Windows trên nền tảng Unix. –

1

Đó là một cách khá kỳ lạ để nhận các giá trị vào danh sách. Vì vậy, tôi giả sử rằng bạn cuối cùng đang cố gắng để dòng từ một tập tin riêng biệt vào một mảng. Trong trường hợp này, bạn chỉ cần thực hiện

file('path/to/file'); 

Để đọc từng dòng vào một mục mảng riêng biệt.

Trong trường hợp tập tin tham chiếu trông giống như:

test 
list 
example 

Nếu bạn biết giá trị lên phía trước như trong mẫu mã của bạn, bạn chỉ nên đặt chúng vào một mảng chứ không phải đọc chúng từ một chuỗi.

Nếu bạn chỉ đơn giản là phải đọc các giá trị từ một chuỗi, tôi sẽ đề nghị sử dụng hằng số PHP_EOL để xác định ngắt dòng của bạn. Như thế này:

$list = 'test' . PHP_EOL . 'list' . PHP_EOL . 'example'; 
$list_arr = explode(PHP_EOL, $list); 

Hằng PHP_EOL sẽ cung cấp cho bạn một cách nền tảng độc lập tốt hơn nhận được giá trị xác định ngắt dòng của bạn.

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