in_array nhiều giá trị


110

Làm cách nào để kiểm tra nhiều giá trị, chẳng hạn như:

$arg = array('foo','bar');

if(in_array('foo','bar',$arg))

Đó là một ví dụ để bạn hiểu rõ hơn một chút, tôi biết nó sẽ không hiệu quả.

Câu trả lời:


200

Giao nhau giữa các mục tiêu bằng đống cỏ khô và đảm bảo rằng điểm giao cắt chính xác bằng các mục tiêu:

$haystack = array(...);

$target = array('foo', 'bar');

if(count(array_intersect($haystack, $target)) == count($target)){
    // all of $target is in $haystack
}

Lưu ý rằng bạn chỉ cần xác minh kích thước của giao điểm kết quả có cùng kích thước với mảng các giá trị mục tiêu để nói rằng đó $haystacklà tập siêu của $target.

Để xác minh rằng ít nhất một giá trị trong $targetcũng có $haystack, bạn có thể thực hiện kiểm tra sau:

 if(count(array_intersect($haystack, $target)) > 0){
     // at least one of $target is in $haystack
 }

13
giải pháp này không phải là tốt nhất: $ kim = array (1,2); $ haystack = array (1,1,2,3); return (count (array_intersect ($ haystack, $ kim)) == count ($ kim)); điều này sẽ trả về false, điều đó không tốt. Giải pháp của Rok Kralj là tốt cho trường hợp này.
ihtus

1
Tôi nghĩ rằng những mảng nên giữ dữ liệu độc đáo và khác giải pháp này sẽ không làm việc
Hashan Kanchana

182

Là một nhà phát triển, bạn có thể nên bắt đầu học các hoạt động tập hợp (khác biệt, liên hiệp, giao điểm). Bạn có thể hình dung mảng của mình như một "bộ" và các khóa bạn đang tìm kiếm mảng còn lại.

Kiểm tra xem TẤT CẢ các kim đều tồn tại

function in_array_all($needles, $haystack) {
   return empty(array_diff($needles, $haystack));
}

echo in_array_all( [3,2,5], [5,8,3,1,2] ); // true, all 3, 2, 5 present
echo in_array_all( [3,2,5,9], [5,8,3,1,2] ); // false, since 9 is not present

Kiểm tra xem có BẤT KỲ kim nào tồn tại không

function in_array_any($needles, $haystack) {
   return !empty(array_intersect($needles, $haystack));
}

echo in_array_any( [3,9], [5,8,3,1,2] ); // true, since 3 is present
echo in_array_any( [4,9], [5,8,3,1,2] ); // false, neither 4 nor 9 is present

9
Lưu ý: kiểu khai báo mảng này là> = PHP 5.4
Claudiu Hojda

Giải pháp tuyệt vời với điều kiện bạn không cần thực hiện so sánh nghiêm ngặt.
faintsignal

14
if(in_array('foo',$arg) && in_array('bar',$arg)){
    //both of them are in $arg
}

if(in_array('foo',$arg) || in_array('bar',$arg)){
    //at least one of them are in $arg
}

7

Đi ra khỏi câu trả lời @Rok Kralj (IMO tốt nhất) để kiểm tra xem có bất kỳ kim nào tồn tại trong đống cỏ khô hay không, bạn có thể sử dụng (bool)thay thế cho câu trả lời !!này đôi khi có thể gây nhầm lẫn trong quá trình xem xét mã.

function in_array_any($needles, $haystack) {
   return (bool)array_intersect($needles, $haystack);
}

echo in_array_any( array(3,9), array(5,8,3,1,2) ); // true, since 3 is present
echo in_array_any( array(4,9), array(5,8,3,1,2) ); // false, neither 4 nor 9 is present

https://glot.io/snippets/f7dhw4kmju


9
Điều này sẽ hữu ích hơn khi nhận xét về câu trả lời của Rok hơn là một câu trả lời mới.
faintsignal

@Jaymin cách như vậy (mà bạn cung cấp ZERO chi tiết) ... làm việc hoàn toàn tốt đẹp cho tôi glot.io/snippets/f7dhw4kmju
sMyles

@sMyles Tôi đã thử sử dụng giá trị chuỗi trong mảng thay vì số nguyên. Bạn có thể thử một lần từ phía bạn và cho tôi biết.
Jaymin

@Jaymin vẫn không gặp sự cố đó glot.io/snippets/f7dhw4kmju
sMyles

Đây bool chuyển đổi là không phù hợp ở đây từ array_intersect trả về một mảng mà có thể để trống hoặc không có sản phẩm nào. @ rok-kralj là giải pháp duy nhất được ưu tiên.
codelearner

3

Giải pháp của IMHO Mark Elliot là giải pháp tốt nhất cho vấn đề này. Nếu bạn cần thực hiện các thao tác so sánh phức tạp hơn giữa các phần tử mảng VÀ bạn đang sử dụng PHP 5.3, bạn cũng có thể nghĩ về điều gì đó như sau:

<?php

// First Array To Compare
$a1 = array('foo','bar','c');

// Target Array
$b1 = array('foo','bar');


// Evaluation Function - we pass guard and target array
$b=true;
$test = function($x) use (&$b, $b1) {
        if (!in_array($x,$b1)) {
                $b=false;
        }
};


// Actual Test on array (can be repeated with others, but guard 
// needs to be initialized again, due to by reference assignment above)
array_walk($a1, $test);
var_dump($b);

Điều này phụ thuộc vào việc đóng cửa; chức năng so sánh có thể trở nên mạnh mẽ hơn nhiều. Chúc may mắn!


Tôi đã thay đổi cách tôi đã làm mọi thứ nên ở đầu ra cuối cùng, tôi không cần phải làm theo cách đó, mặc dù nó luôn tốt để học, cảm ơn bạn đã đóng góp ý kiến ​​và thời gian của bạn!
daryl

2
if(empty(array_intersect([21,22,23,24], $check_with_this)) {
 print "Not found even a single element";
} else {
 print "Found an element";
}

array_intersect () trả về một mảng chứa tất cả các giá trị của array1 có trong tất cả các đối số. Lưu ý rằng các khóa được giữ nguyên.

Trả về một mảng chứa tất cả các giá trị trong mảng1 có giá trị tồn tại trong tất cả các tham số.


trống() - Xác định xem một biến có trống không

Trả về FALSE nếu var tồn tại và có giá trị khác rỗng, khác 0. Nếu không, trả về TRUE.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.