2010-02-21 5 views
38

tôi có 2 mảng, giá trị sẽ được nạp từ cơ sở dữ liệu, dưới đây là một ví dụ:Tôi có thể sử dụng in_array như thế nào nếu kim là một mảng?

$arr1 = array(1,2,3); 
$arr2 = array(1,2,3,4,5,6,7); 

Những gì tôi muốn làm là để kiểm tra xem tất cả các giá trị trong $arr1 tồn tại trong $arr2. Ví dụ trên phải là một TRUE khi:

$arr3 = array(1,2,4,5,6,7); 

so sánh $arr1 với $arr3 sẽ trả về một FALSE.

Thông thường tôi sử dụng in_array vì tôi chỉ cần kiểm tra giá trị đơn lẻ vào một mảng. Nhưng trong trường hợp này, không thể sử dụng in_array. Tôi muốn xem nếu có một cách đơn giản để làm việc kiểm tra với một vòng lặp tối thiểu.

CẬP NHẬT để làm rõ.

Mảng đầu tiên sẽ là tập hợp chứa các giá trị duy nhất. Mảng thứ hai có thể chứa các giá trị trùng lặp. Cả hai đều được đảm bảo một mảng trước khi xử lý.

+0

Có thể đáng làm rõ: Bạn đang tìm kiếm ngữ nghĩa "bộ" bình thường? Bạn sẽ mong đợi kết quả gì nếu mảng thứ hai là mảng (1,2,4,3)? Điều gì sẽ xảy ra nếu mảng đầu tiên là mảng (1,1,1,1)? Hay chúng là bất hợp pháp? – Oddthinking

Trả lời

58

Sử dụng array_diff():

$arr1 = array(1,2,3); 
$arr2 = array(1,2,3,4,5,6,7); 
$arr3 = array_diff($arr1, $arr2); 
if (count($arr3) == 0) { 
    // all of $arr1 is in $arr2 
} 
+0

+1 cho điểm tôi đến 'array_diff()' chức năng và đưa ra ví dụ sử dụng. –

5

Bạn có thể thử sử dụng chức năng array_diff() để tìm sự khác biệt giữa hai mảng, điều này có thể giúp bạn. Tôi nghĩ rằng để làm rõ bạn có nghĩa là, tất cả các giá trị trong mảng đầu tiên phải được trong mảng thứ hai, nhưng không phải là cách khác xung quanh.

+0

Có Sam. Tất cả các giá trị '$ arr1' phải xuất hiện trong mảng thứ hai, để có điều kiện' TRUE', nếu không, 'FALSE'. Tôi sẽ xem xét 'array_diff()'. Cảm ơn –

27

Bạn có thể sử dụng array_intersect hay array_diff:

$arr1 = array(1,2,3); 
$arr2 = array(1,2,3,4,5,6,7); 

if ($arr1 == array_intersect($arr1, $arr2)) { 
    // All elements of arr1 are in arr2 
} 

Tuy nhiên, nếu bạn không cần phải sử dụng kết quả của sự giao nhau (mà có vẻ là trường hợp của bạn), không gian và thời gian hiệu quả hơn để sử dụng array_diff:

$arr1 = array(1,2,3); 
$arr2 = array(1,2,3,4,5,6,7); 
$diff = array_diff($arr1, $arr2); 

if (empty($diff)) { 
    // All elements of arr1 are in arr2 
} 
+0

+1 để chỉ các hàm 'array_intersect()' và đưa ra ví dụ sử dụng. –

0

Trong trường hợp cụ thể của tôi, tôi cần kiểm tra xem một cặp id đã được xử lý trước đó hay chưa. Vì vậy, đơn giản array_diff() đã không làm việc cho tôi.

Thay vào đó tôi tạo ra các phím từ id được sắp xếp theo thứ tự abc và sử dụng chúng với in_array:

<?php 
$pairs = array(); 
// ... 
$pair = array($currentId, $id); 
sort($pair); 
$pair = implode('-', $pair); 
if (in_array($pair, $pairs)) { 
    continue; 
} 
$pairs[$pair] = $pair; 

Đây có lẽ không phải là một giải pháp tối ưu ở tất cả nhưng tôi chỉ cần nó cho một kịch bản bẩn được thực hiện một lần.