GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Downloads
  • Documentation
  • Get Involved
  • Help
  • Getting Started
  • Introduction
  • A simple tutorial
  • Language Reference
  • Basic syntax
  • Types
  • Variables
  • Constants
  • Expressions
  • Operators

This view

  • Original page
  • New address

GeezerVison is showing www.php.net — PHP: array_intersect - Manual

PHP 8.6.0RC7 available for testing
    array_intersect_assoc »
    « array_flip
    • Preface
    • Function Reference
    • Variable and Type Related Extensions
    • Arrays
    • Array Functions

    array_intersect

    (PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

    array_intersect — Computes the intersection of arrays

    Description

    function array_intersect(array $array, array ...$arrays): array

    array_intersect() returns an array containing all the values of array that are present in all the arguments. Note that keys are preserved.

    Parameters

    array

    The array with master values to check.

    arrays

    Arrays to compare values against.

    Return Values

    Returns an array containing all of the values in array whose values exist in all of the parameters.

    Changelog

    Version Description
    8.0.0 This function can now be called with only one parameter. Formerly, at least two parameters have been required.

    Examples

    Example #1 array_intersect() example

    <?php
    $array1 = array("a" => "green", "red", "blue");
    $array2 = array("b" => "green", "yellow", "red");
    $result = array_intersect($array1, $array2);
    print_r($result);
    ?>

    The above example will output:

    Array
    (
        [a] => green
        [0] => red
    )

    Notes

    Note:

    Two elements are considered equal if and only if (string) $elem1 === (string) $elem2. In words: when the string representation is the same.

    See Also

    • array_intersect_assoc() - Computes the intersection of arrays with additional index check
    • array_diff() - Computes the difference of arrays
    • array_diff_assoc() - Computes the difference of arrays with additional index check

    Found A Problem?

    Learn How To Improve This Page • Submit a Pull Request • Report a Bug
    +add a note

    User Contributed Notes 21 notes

    up
    down
    175
    stuart at horuskol dot co dot uk ¶
    18 years ago
    A clearer example of the key preservation of this function:
    
    <?php
    
    $array1 = array(2, 4, 6, 8, 10, 12);
    $array2 = array(1, 2, 3, 4, 5, 6);
    
    var_dump(array_intersect($array1, $array2));
    var_dump(array_intersect($array2, $array1));
    
    ?>
    
    yields the following:
    
    array(3) {
      [0]=> int(2)
      [1]=> int(4)
      [2]=> int(6)
    }
    
    array(3) {
      [1]=> int(2)
      [3]=> int(4)
      [5]=> int(6)
    }
    
    This makes it important to remember which way round you passed the arrays to the function if these keys are relied on later in the script.
    up
    down
    78
    Niels ¶
    20 years ago
    Here is a array_union($a, $b):
    
    <?php
                                            //  $a = 1 2 3 4
        $union =                            //  $b =   2   4 5 6
            array_merge(
                array_intersect($a, $b),    //         2   4
                array_diff($a, $b),         //       1   3
                array_diff($b, $a)          //               5 6
            );                              //  $u = 1 2 3 4 5 6
    ?>
    up
    down
    6
    Anonymous ¶
    5 years ago
    array_intersect             use Value, not callback
    array_uintersect            use Value, callback receives Value
    array_intersect_key         use Key, not callback
    array_intersect_ukey        use Key, callback receives Key
    array_intersect_assoc       use Both, not callback
    array_intersect_uassoc      use Both, callback receives Key ONLY
    array_uintersect_assoc      use Both, callback receives Value ONLY
    array_uintersect_uassoc     use Both, One callback receives the Key, the other receives the Value.
    up
    down
    7
    theking at king dot ma ¶
    4 years ago
    I use array_intersect for a quick check of $_GET parameters;
    
    <?php declare(strict_types=1)
    
    $_params = ['cust_id','prod_id'];
    $_params_check = array_intersect(array_keys($_GET),$_params);
    if(count($_params_check) !== count($_params)) {
        header("HTTP/1.1 400 Bad Request");
        die();
    }
    ?>
    
    the file will die with a 400 error if cust_id or prod_id or both are missing from $_GET. But i could be used on $_POST and $_REQUEST as  well obviously.
    up
    down
    24
    Shawn Pyle ¶
    17 years ago
    array_intersect handles duplicate items in arrays differently. If there are duplicates in the first array, all matching duplicates will be returned. If there are duplicates in any of the subsequent arrays they will not be returned. 
    
    <?php
    array_intersect(array(1,2,2),array(1,2,3)); //=> array(1,2,2)
    array_intersect(array(1,2,3),array(1,2,2)); //=> array(1,2)
    ?>
    up
    down
    12
    yuval at visualdomains dot com ¶
    11 years ago
    Using isset to achieve this, is many times faster:
    
    <?php
    
     $m = range(1,1000000);
      $s = [2,4,6,8,10];
    
    // Use array_intersect to return all $m values that are also in $s
      $tstart = microtime(true);
      print_r (array_intersect($m,$s));
      $tend = microtime(true);
      $time = $tend - $tstart;
      echo "Took $time";
      
     // Use array_flip and isset to return all $m values that are also in $s
      $tstart = microtime(true);
      $f = array_flip($s);
    /* $f now looks like this:
    (
        [2] => 0
        [4] => 1
        [6] => 2
        [8] => 3
        [10] => 4
    )
    */
    // $u will hold the intersected values
      $u = [];
      foreach ($m as $v) {
        if (isset($f[$v])) $u[] = $v;
      }
      print_r ($u);
       $tend = microtime(true);
      $time = $tend - $tstart;
      echo "Took $time";
    ?>
    
    Results:
    
    Array
    (
        [1] => 2
        [3] => 4
        [5] => 6
        [7] => 8
        [9] => 10
    )
    Took 4.7170009613037
    (
        [0] => 2
        [1] => 4
        [2] => 6
        [3] => 8
        [4] => 10
    )
    Took 0.056024074554443
    
    array_intersect: 4.717
    array_flip+isset: 0.056
    up
    down
    10
    dml at nm dot ru ¶
    15 years ago
    The built-in function returns wrong result when input arrays have duplicate values.
    Here is a code that works correctly:
    
    <?php
    function array_intersect_fixed($array1, $array2) {
        $result = array();
        foreach ($array1 as $val) {
          if (($key = array_search($val, $array2, TRUE))!==false) {
             $result[] = $val;
             unset($array2[$key]);
          }
        }
        return $result;
    }
    ?>
    up
    down
    21
    sapenov at gmail dot com ¶
    21 years ago
    If you need to supply arbitrary number of arguments 
    to array_intersect() or other array function, 
    use following function:
    
    $full=call_user_func_array('array_intersect', $any_number_of_arrays_here);
    up
    down
    15
    blu at dotgeek dot org ¶
    22 years ago
    Note that array_intersect and array_unique doesnt work well with multidimensional arrays.
    If you have, for example, 
    
    <?php
    
    $orders_today[0] = array('John Doe', 'PHP Book');
    $orders_today[1] = array('Jack Smith', 'Coke');
    
    $orders_yesterday[0] = array('Miranda Jones', 'Digital Watch');
    $orders_yesterday[1] = array('John Doe', 'PHP Book');
    $orders_yesterday[2] = array('Z? da Silva', 'BMW Car');
    
    ?>
    
    and wants to know if the same person bought the same thing today and yesterday and use array_intersect($orders_today, $orders_yesterday) you'll get as result:
    
    <?php
    
    Array
    (
        [0] => Array
            (
                [0] => John Doe
                [1] => PHP Book
            )
    
        [1] => Array
            (
                [0] => Jack Smith
                [1] => Coke
            )
    
    )
    
    ?>
    
    but we can get around that by serializing the inner arrays:
    <?php
    
    $orders_today[0] = serialize(array('John Doe', 'PHP Book'));
    $orders_today[1] = serialize(array('Jack Smith', 'Coke'));
    
    $orders_yesterday[0] = serialize(array('Miranda Jones', 'Digital Watch'));
    $orders_yesterday[1] = serialize(array('John Doe', 'PHP Book'));
    $orders_yesterday[2] = serialize(array('Z? da Silva', 'Uncle Tungsten'));
    
    ?>
    
    so that array_map("unserialize", array_intersect($orders_today, $orders_yesterday)) will return:
    
    <?php
    
    Array
    (
        [0] => Array
            (
                [0] => John Doe
                [1] => PHP Book
            )
    
    )
    
    ?>
    
    showing us who bought the same thing today and yesterday =)
    
    []s
    up
    down
    4
    Esfandiar -- e.bandari at gmail dot com ¶
    18 years ago
    Regarding array union:  Here is a faster version array_union($a, $b)
    
    But it is not needed!  See below.
    
    <?php
                                            //  $a = 1 2 3 4
        $union =                            //  $b =   2   4 5 6
            array_merge(
                $a,    
                array_diff($b, $a)          //               5 6
            );                              //  $u = 1 2 3 4 5 6
    ?> 
    
    You get the same result with $a + $b.
    
    N.B. for associative array the results of $a+$b and $b+$a are different, I think array_diff_key is used.
    
    Cheers, E
    up
    down
    2
    matang dot dave at gmail dot com ¶
    11 years ago
    Take care of value types while using array_intersect function as there is no option for strict type check as in in_array function.
    
    $array1 = array(true,2);
    $array2 = array(1, 2, 3, 4, 5, 6);
    
    var_dump(array_intersect($array1, $array2));
    
    result is :
    array(2) {
            [0] =>  bool(true)
            [1]  =>  int(2)
    }
    up
    down
    1
    Malte ¶
    18 years ago
    Extending the posting by Terry from 07-Feb-2006 04:42:
    
    If you want to use this function with arrays which have sometimes the same value several times, it won't be checked if they're existing in the second array as much as in the first.
    So I delete the value in the second array, if it's found there:
    
    <?php
    $firstarray = array(1, 1, 2, 3, 4, 1);
    $secondarray = array(4, 1, 6, 5, 4, 1);
    
    //array_intersect($firstarray, $secondarray): 1, 1, 1, 4
    
    foreach ($firstarray as $key=>$value){
        if (!in_array($value,$secondarray)){
            unset($firstarray[$key]);
        }else{
            unset($secondarray[array_search($value,$secondarray)]);
        }
    }
    
    //$firstarray: 1, 1, 4
    
    ?>
    up
    down
    1
    nthitz at gmail dot com ¶
    20 years ago
    I did some trials and if you know the approximate size of the arrays then it would seem to be a lot faster to do this <?php array_intersect($smallerArray, $largerArray); ?> Where $smallerArray is the array with lesser items. I only tested this with long strings but I would imagine that it is somewhat universal.
    up
    down
    1
    theking2(at)king(dot)ma ¶
    2 years ago
    A more generic parameter checking:
    
    <?php
    /**
     * Check if all required parameters are present in the request
     *
     * @param  mixed $request any of $_GET, $_POST, $_REQUEST
     * @param  mixed $required array of required parameters
     * @return bool true if all required parameters are present
     */
    function check_params( array $request, array $required ): bool
    {
        $check = array_intersect( array_keys( $request ), $required );
        return count( $check ) === count( $required );
    }
    ?>
    
    Use this like
    <?php
    if( !check_params( $_GET, ['cust_id','prod_id'] ) {
        header( "HTTP/1.1 400 Bad Request" );
        echo "Bad Request";
        exit();
    }
    ?>
    
    Let me know if something is build in PHP already...
    up
    down
    0
    ivan dot jelenic42 at gmail dot com ¶
    1 year ago
    It preserves from the first array:
    - keys
    - order of elements
    - duplicates
    
    Duplicates: note that if the first array has just one value, and the other array has two of those values, only one will be returned, but in the opposite case, two will be returned.
    
    Order of elements: it's preserved from the first array even if integer keys are out of order.
    
    Example:
    ________________________________
    <?php
    
    $array1 = ['a' => 'cherry', 'b' => 'banana', 'c' => 'cherry'];
    $array2 = [1 => 'banana', 0 => 'cherry', 2 => 'date'];
    
    $result1 = array_intersect($array1, $array2);
    $result2 = array_intersect($array2, $array1);
    
    echo "Result from array_intersect(\$array1, \$array2):\n";
    print_r($result1);
    
    echo "\nResult from array_intersect(\$array2, \$array1):\n";
    print_r($result2);
    
    ?>
    ___________________________________________
    Outputs:
    
    Result from array_intersect($array1, $array2):
    Array
    (
        [a] => cherry
        [b] => banana
        [c] => cherry
    )
    
    Result from array_intersect($array2, $array1):
    Array
    (
        [1] => banana
        [0] => cherry
    )
    up
    down
    1
    t dot wiltzius at insightbb dot com ¶
    22 years ago
    I needed to compare an array with associative keys to an array that contained some of the keys to the associative array. Basically, I just wanted to return only a few of the entries in the original array, and the keys to the entries I wanted were stored in another array. This is pretty straightforward (although complicated to explain), but I couldn't find a good function for comparing values to keys. So I wrote this relatively straightforward one:
    
    <?php
    
    function key_values_intersect($values,$keys) {
       foreach($keys AS $key) {
          $key_val_int[$key] = $values[$key];
          }
       return $key_val_int;
       }
    
    $big = array("first"=>2,"second"=>7,"third"=>3,"fourth"=>5);
    $subset = array("first","third");
    
    print_r(key_values_intersect($big,$subset));
    
    ?>
    
    This will return:
    
    Array ( [first] => 2 [third] => 3 )
    up
    down
    1
    Yohann ¶
    16 years ago
    I used array_intersect in order to sort an array arbitrarly:
    
    <?php
    $a = array('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'height', 'nine', 'ten');
    $b = array('four', 'one', 'height', 'five')
    var_dump(array_intersect($a, $b);
    ?>
    
    will output:
    
    0 => 'one'
    1 => 'four'
    2 => 'five'
    3 => 'height'
    
    i hope this can help...
    up
    down
    0
    info at iridsystem dot it ¶
    11 years ago
    This function is able to sort an array based on another array that contains the order of occurrence. The values that are not present will be transferred into the end of the resultant.
    Questa funzione permette di ordinare i valori di un array ($tosort) basandosi sui valori contenuti in un secondo array ($base), i valori non trovati verranno posizionati alla fine dell'ordinamento senza un'ordine specifico.
    
    <?
    $base= array('one', 'two', 'three');
    
    $tosort= array('a'=>'two', 'b'=>'three', 'c'=>'five', 'd'=>'one', 'and'=>'four', 'f'=>'one');
    
    uasort($tosort, function($key1, $key2) use ($base) {
      $a1=array_search($key1, $base);
      $a2=array_search($key2, $base);
    
      if ( $a1===false && $a2===false ) { return 0; }
      else if ( $a1===false && $a2 !== false) { return 1; }
      else if ( $a1!==false && $a2 === false) {return -1;}
    
      if( $a1 > $a2 ) { return 1; }
      else if ( $a1 < $a2 ) { return -1; }
      else if ( $a1 == $a2 ) { return 0; }        
    });
    var_dump($tosort);
    /*
    the resulting of $tosort
    array
      'd' => string 'one' (length=3)
      'f' => string 'one' (length=3)
      'a' => string 'two' (length=3)
      'b' => string 'three' (length=3)
      'c' => string 'five' (length=6)
      'e' => string 'four' (length=7)
    */
    Gabriel
    ?>
    up
    down
    0
    Oto Brglez ¶
    17 years ago
    If you wish to create intersection with arrays that are empty. Than the result of intersection is empty array.
    
    If you wish to change this. I sugest that you do this.
    It simply "ignores" empty arrays. Before loop use 1st array.
    
    <?php
    
    $a = array();
    $a[] = 1;
    $a[] = 2;
    $a[] = 3;
    
    $b = array();
    $b[] = 4;
    $b[] = 5;
    $b[] = 1;
    
    $c = array();
    $c[] = 1;
    $c[] = 5;
    $d = array();
    
    $kb=array('a','b','c','d');
    
    $out = $a;
    foreach($kb as $k){
        if(!empty(${$k})) $out = array_intersect($out,${$k});
    };
    print_r($out);
    // The result is array 
    
    // The result is empty array
    print_r(array_intersect($a,$b,$c,$d));
    
    ?>
    up
    down
    0
    karl at libsyn dot com ¶
    17 years ago
    Given a multidimensional array that represents AND/OR relationships (example below), you can use a recursive function with array_intersect() to see if another array matches that set of relationships.  
    
    For example: array( array( 'red' ), array( 'white', 'blue' ) ) represents "red OR ( white AND blue )".  array( 'red', array( 'white', 'blue' ) ) would work, too, BTW.
    
    If I have array( 'red' ) and I want to see if it matches the AND/OR array, I use the following function.  It returns the matched array, 
    but can just return a boolean if that's all you need:
    
    <?php
    $needle = array( array( 'red' ), array( 'white', 'blue' ) );
    $haystack = array( 'red' );
    
    function findMatchingArray( $needle, $haystack ) {
        foreach( $needle as $element ) {
            $test_element = (array) $element;
            if( count( $test_element ) == count( array_intersect( $test_element, $haystack ) ) ) {
                return $element;
            }
    
        }
        return false;
    }
    ?>
    
    Pretty tough to describe what I needed it to do, but it worked.  I don't know if anyone else out there needs something like this, but hope this helps.
    up
    down
    -1
    zoolyka at gmail dot com ¶
    8 years ago
    If you have to intersect arrays of unique values then using array_intersect_key is about 20 times faster, just have to flip the key value pairs of the arrays, then flip the result again.
    
    <?php
    
    $one = range(1, 250000);
    $two = range(50000, 150000);
    
    $start = microtime(true);
    
    $intersection = array_intersect($one, $two);
    
    echo "Did it in ".( microtime(true) - $start )." seconds.\n";
    
    $start = microtime(true);
    
    $intersection = array_flip(array_intersect_key(array_flip($one), array_flip($two)));
    
    echo "Did it in ".( microtime(true) - $start )." seconds.\n";
    
    ?>
    
    Did it in 0.89163708686829 seconds.
    Did it in 0.038213968276978 seconds.
    +add a note
    • Array Functions
      • array
      • array_​all
      • array_​any
      • array_​change_​key_​case
      • array_​chunk
      • array_​column
      • array_​combine
      • array_​count_​values
      • array_​diff
      • array_​diff_​assoc
      • array_​diff_​key
      • array_​diff_​uassoc
      • array_​diff_​ukey
      • array_​fill
      • array_​fill_​keys
      • array_​filter
      • array_​find
      • array_​find_​key
      • array_​first
      • array_​flip
      • array_​intersect
      • array_​intersect_​assoc
      • array_​intersect_​key
      • array_​intersect_​uassoc
      • array_​intersect_​ukey
      • array_​is_​list
      • array_​key_​exists
      • array_​key_​first
      • array_​key_​last
      • array_​keys
      • array_​last
      • array_​map
      • array_​merge
      • array_​merge_​recursive
      • array_​multisort
      • array_​pad
      • array_​pop
      • array_​product
      • array_​push
      • array_​rand
      • array_​reduce
      • array_​replace
      • array_​replace_​recursive
      • array_​reverse
      • array_​search
      • array_​shift
      • array_​slice
      • array_​splice
      • array_​sum
      • array_​udiff
      • array_​udiff_​assoc
      • array_​udiff_​uassoc
      • array_​uintersect
      • array_​uintersect_​assoc
      • array_​uintersect_​uassoc
      • array_​unique
      • array_​unshift
      • array_​values
      • array_​walk
      • array_​walk_​recursive
      • arsort
      • asort
      • compact
      • count
      • current
      • end
      • extract
      • in_​array
      • key
      • key_​exists
      • krsort
      • ksort
      • list
      • natcasesort
      • natsort
      • next
      • pos
      • prev
      • range
      • reset
      • rsort
      • shuffle
      • sizeof
      • sort
      • uasort
      • uksort
      • usort
    • Deprecated
      • each
    You are visitor 01402503 — GeezerVison does not store the pages you look up.
    Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.