in_array หลายค่า


110

ฉันจะตรวจสอบหลายค่าได้อย่างไรเช่น:

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

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

นั่นคือตัวอย่างเพื่อให้คุณเข้าใจดีขึ้นเล็กน้อยฉันรู้ว่ามันไม่ได้ผล

คำตอบ:


200

ตัดเป้าหมายด้วยกองหญ้าและตรวจสอบให้แน่ใจว่าจุดตัดนั้นเท่ากับเป้าหมายอย่างแม่นยำ:

$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
 }

13
วิธีนี้ไม่ดีที่สุด: $ เข็ม = อาร์เรย์ (1,2); $ haystack = อาร์เรย์ (1,1,2,3); return (count (array_intersect ($ haystack, $ needle)) == count ($ เข็ม)); สิ่งนี้จะส่งคืนเท็จซึ่งไม่ดี วิธีแก้ของ Rok Kralj นั้นดีสำหรับกรณีนี้
ihtus

1
ฉันคิดว่าอาร์เรย์เหล่านั้นควรเก็บข้อมูลที่ไม่ซ้ำกันมิฉะนั้นวิธีนี้จะใช้ไม่ได้
แฮชานกาญจนา

183

ในฐานะนักพัฒนาคุณน่าจะเริ่มเรียนรู้การทำงานของเซต (ความแตกต่างสหภาพทางแยก) คุณสามารถจินตนาการว่าอาร์เรย์ของคุณเป็น "ชุด" หนึ่งชุดและคีย์ที่คุณกำลังค้นหาอีกชุดหนึ่ง

ตรวจสอบว่ามีเข็มทั้งหมดหรือไม่

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

9
หมายเหตุ: การประกาศอาร์เรย์ประเภทนี้คือ> = PHP 5.4
Claudiu Hojda

โซลูชันที่ยอดเยี่ยมหากคุณไม่จำเป็นต้องทำการเปรียบเทียบอย่างเข้มงวด
faintsignal

15
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

การออกจากคำตอบ @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

https://glot.io/snippets/f7dhw4kmju


9
สิ่งนี้จะเป็นประโยชน์ในการแสดงความคิดเห็นเกี่ยวกับคำตอบของ Rok มากกว่าคำตอบใหม่
faintsignal

@Jaymin อย่างไร (คุณให้รายละเอียด ZERO) ... ทำงานได้ดีอย่างสมบูรณ์สำหรับฉันglot.io/snippets/f7dhw4kmju
sMyles

@sMyles ฉันได้ลองใช้ค่าสตริงในอาร์เรย์แทนจำนวนเต็ม คุณสามารถลองครั้งเดียวจากด้านข้างของคุณและแจ้งให้เราทราบ
Jaymin

@Jaymin ยังไม่มีปัญหาglot.io/snippets/f7dhw4kmju
sMyles

นี้บูลแปลงไม่เหมาะที่นี่ตั้งแต่array_intersectส่งกลับอาร์เรย์ซึ่งอาจจะว่างหรือไม่ว่างเปล่า @ rok-kralj เป็นวิธีเดียวที่ต้องการ
codelearner

3

ทางออกที่ดีที่สุดของ 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);

สิ่งนี้อาศัยการปิด ฟังก์ชันการเปรียบเทียบสามารถมีประสิทธิภาพมากขึ้น โชคดี!


ฉันเปลี่ยนวิธีที่ฉันทำทุกอย่างไปแล้วดังนั้นในผลลัพธ์สุดท้ายฉันไม่จำเป็นต้องทำอย่างใดอย่างหนึ่งแม้ว่าจะเป็นการดีที่จะเรียนรู้ขอบคุณสำหรับข้อมูลและเวลาของคุณ!
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 ()ส่งคืนอาร์เรย์ที่มีค่าทั้งหมดของ array1 ที่มีอยู่ในอาร์กิวเมนต์ทั้งหมด โปรดทราบว่าคีย์จะถูกเก็บรักษาไว้

ส่งคืนอาร์เรย์ที่มีค่าทั้งหมดใน array1 ซึ่งมีค่าอยู่ในพารามิเตอร์ทั้งหมด


ว่าง () -กำหนดว่าตัวแปรว่างหรือไม่

ส่งคืนค่า FALSE หาก var มีอยู่และมีค่าที่ไม่ใช่ค่าว่างไม่ใช่ศูนย์ มิฉะนั้นจะคืนค่า TRUE

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.