ฉันจะตรวจสอบหลายค่าได้อย่างไรเช่น:
$arg = array('foo','bar');
if(in_array('foo','bar',$arg))
นั่นคือตัวอย่างเพื่อให้คุณเข้าใจดีขึ้นเล็กน้อยฉันรู้ว่ามันไม่ได้ผล
ฉันจะตรวจสอบหลายค่าได้อย่างไรเช่น:
$arg = array('foo','bar');
if(in_array('foo','bar',$arg))
นั่นคือตัวอย่างเพื่อให้คุณเข้าใจดีขึ้นเล็กน้อยฉันรู้ว่ามันไม่ได้ผล
คำตอบ:
ตัดเป้าหมายด้วยกองหญ้าและตรวจสอบให้แน่ใจว่าจุดตัดนั้นเท่ากับเป้าหมายอย่างแม่นยำ:
$haystack = array(...);
$target = array('foo', 'bar');
if(count(array_intersect($haystack, $target)) == count($target)){
// all of $target is in $haystack
}
โปรดทราบว่าคุณจะต้องตรวจสอบขนาดของสี่แยกที่เกิดขึ้นเป็นขนาดเดียวกับอาร์เรย์ของค่าเป้าหมายที่จะบอกว่าเป็นซูเปอร์$haystack
$target
ในการตรวจสอบว่ามีอย่างน้อยหนึ่งค่า$target
อยู่ใน$haystack
ด้วยคุณสามารถทำการตรวจสอบนี้:
if(count(array_intersect($haystack, $target)) > 0){
// at least one of $target is in $haystack
}
ในฐานะนักพัฒนาคุณน่าจะเริ่มเรียนรู้การทำงานของเซต (ความแตกต่างสหภาพทางแยก) คุณสามารถจินตนาการว่าอาร์เรย์ของคุณเป็น "ชุด" หนึ่งชุดและคีย์ที่คุณกำลังค้นหาอีกชุดหนึ่ง
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
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
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
}
การออกจากคำตอบ @Rok Kralj (IMO ที่ดีที่สุด) เพื่อตรวจสอบว่ามีเข็มใดอยู่ในกองหญ้าหรือไม่คุณสามารถใช้(bool)
แทน!!
ซึ่งบางครั้งอาจทำให้เกิดความสับสนในระหว่างการตรวจสอบรหัส
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
ทางออกที่ดีที่สุดของ IMHO Mark Elliot สำหรับปัญหานี้ หากคุณต้องการทำการเปรียบเทียบที่ซับซ้อนมากขึ้นระหว่างองค์ประกอบอาร์เรย์และคุณใช้ PHP 5.3 คุณอาจคิดถึงสิ่งต่อไปนี้:
<?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);
สิ่งนี้อาศัยการปิด ฟังก์ชันการเปรียบเทียบสามารถมีประสิทธิภาพมากขึ้น โชคดี!
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 ()ส่งคืนอาร์เรย์ที่มีค่าทั้งหมดของ array1 ที่มีอยู่ในอาร์กิวเมนต์ทั้งหมด โปรดทราบว่าคีย์จะถูกเก็บรักษาไว้
ส่งคืนอาร์เรย์ที่มีค่าทั้งหมดใน array1 ซึ่งมีค่าอยู่ในพารามิเตอร์ทั้งหมด
ว่าง () -กำหนดว่าตัวแปรว่างหรือไม่
ส่งคืนค่า FALSE หาก var มีอยู่และมีค่าที่ไม่ใช่ค่าว่างไม่ใช่ศูนย์ มิฉะนั้นจะคืนค่า TRUE