• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • array_intersect()

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

    计算数组的交集

    说明

    array_intersect(array $array1,array $array2[,array $...]): array

    array_intersect()返回一个数组,该数组包含了所有在$array1中也同时出现在所有其它参数数组中的值。注意键名保留不变。

    参数

    $array1

    要检查的数组,作为主值。

    $array2

    要被对比的数组。

    要对比的数组列表。

    返回值

    返回一个数组,该数组包含了所有在$array1中也同时出现在所有其它参数数组中的值。

    范例

    Example #1array_intersect()例子

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

    以上例程会输出:

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

    注释

    Note:两个单元仅在(string)$elem1 ===(string)$elem2时被认为是相同的。也就是说,当字符串的表达是一样的时候。

    参见

    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.
    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
    ?>
    
    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);
    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)
    ?>
    
    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
    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)
    }
    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
    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
    ?>
    
    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;
    }
    ?>
    
    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 )
    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
    ?>
    
    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
    I wrote this function to recursively replace array keys with array values (flip) and fill values with defined value. it can be used for recursive array intersect functions .
    <?php
    function array_values_to_keys_r($array, $fill_value = null)
    {
      $flipped = [];
      foreach ($array as $key => $value) {
        if (is_array($value)) {
          $flipped [$key] = array_values_to_keys_r($value);
        } else {
          $flipped [$value] = $fill_value;
        }
      }
      return $flipped;
    }
    ?>
    
    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.
    $x = array('ram@hb.in', 'ram', 'rams@hb.in');
      $y = array('1231231231');
      $result=array_intersect($x,$z);
      $res = array_intersect($y, $z);
    <?php
    $a=array(1,2,'3',4);
    $b=array('1',2,3);
    var_dump($a,$b);
    result:
    array (size=3)
     0 => int 1
     1 => int 2
     2 => string '3' (length=1)
    ?>
    
    Also note that, even without the availability of the strict mode switch, false does not match 0:
    array_intersect([false], [0]) == [];
    Even in PHP 7.1
    I bench-marked some uses of array_intersect and can't believe how slow it is. This isn't as elaborate, but handles most cases and is much faster:
    <?php
    /**
    examines two arrays and returns the intersected arrays with matching keys (ignores duplicate keys)
    */
    function simple_array_intersect($a,$b) {
      $a_assoc = $a != array_values($a);
      $b_assoc = $b != array_values($b);
      $ak = $a_assoc ? array_keys($a) : $a;
      $bk = $b_assoc ? array_keys($b) : $b;
      $out = array();
      for ($i=0;$i<sizeof($ak);$i++) { 
        if (in_array($ak[$i],$bk)) {
          if ($a_assoc) {
            $out[$ak[$i]] = $a[$ak[$i]];
          } else {
            $out[] = $ak[$i];
          }
        }
      }
      return $out;
    }
    ?>
    You can try this out with this:
    <?php
    // create a large array (simple)
    $first = array();
    for ($i=500;$i<500000;$i++) {
      $first[] = $i;
    }
    // create a smaller array (associative)
    $second = array();
    for ($i=499990;$i<500000;$i++) {
      $second[$i] = rand();
    }
    echo microtime(true)."\n";
    // built-in function
    print_r(array_intersect($first,$second));
    echo microtime(true)."\n";
    // favour simple array as match
    print_r(simple_array_intersect($first,$second));
    echo microtime(true)."\n";
    // favour associative keys for match
    print_r(simple_array_intersect($second,$first));
    echo microtime(true)."\n";
    ?>
    
    If you're looking for a relatively easy way to strictly intersect keys and values recursively without array key reordering, here's a simple recursive function:
    <?php
    function array_intersect_recursive($array1, $array2)
    {
     foreach($array1 as $key => $value)
     {
      if (!isset($array2[$key]))
      {
       unset($array1[$key]);
      }
      else
      {
       if (is_array($array1[$key])) 
       {
        $array1[$key] = array_intersect_recursive($array1[$key], $array2[$key]);
       }
       elseif ($array2[$key] !== $value)
       {
        unset($array1[$key]);
       }
      }
     }
     return $array1;
    }
    ?>
    
    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...
    I couldn't get array_intersect to work with two arrays of identical objects, so I just did this:
    foreach ($firstarray as $key=>$value){
      if (!in_array($value,$secondarray)){
        unset($firstarray[$key]);
      }
    }
    This leaves $firstarray as the intersection.
    Seems to work fine & reasonably quickly.
    If you store a string of keys in a database field and want to match them to a static array of values, this is a quick way to do it without loops:
    <?
    $vals = array("Blue","Green","Pink","Yellow");
    $db_field = "0,2,3";
    echo implode(", ", array_flip(array_intersect(array_flip($vals), explode(",", $db_field))));
    // will output "Blue, Pink, Yellow"
    ?>
    
    This is also handy for testing an array for one of a series of acceptable elements. As a simple example, if you're expecting the query string to contain one of, say, user_id, order_id or item_id, to find out which one it is you could do this:
    <?php
      $valid_ids = array ('user_id', 'item_id', 'order_id');
      if ($id = current (array_intersect ($valid_ids, array_keys ($_GET))))
      {
        // do some stuff with it
      }
      else
        // error - invalid id passed, or none at all
    ?>
    ...which could be useful for constructing an SQL query, or some other situation where testing for them one by one might be too clumsy.
    To check whether an array $a is a subset of array $b, do the following:
    <?php
    if(array_unique($b + $a) === $b)
    //...
    ?>
    Actually, PHP ought to have a function that does this for you. But the above example works.
    i wrote this one to get over the problem i found in getting strings intersected instead of arrays as there is no function in php.
    <?php
    function matched_main_numbers($string, $string2)
    {
    $string = "04 16 17 20 29";
    $arr1 = explode(" ", $string);
    $string2 = "45 34 04 29 16";
    $arr2 = explode(" ", $string2);
    $array = array_intersect($arr1, $arr2);
    $comma_separated = implode($array);
    $str = $comma_separated;
    $balls = "$comma_separated";
    $matched_balls = chunk_split($balls,2," ");
    $matched_balls =" $matched_balls";
    $number_of_matched_main_balls = strlen($str);
    $number_of_matched_main_balls = ($number_of_matched_main_balls/2);
    $numbers = "You matched $number_of_matched_main_balls main balls";
    return $numbers;
        
    }
    ?>
    
    Actually array_intersect finds the dublicate values, here is my approach which is 5 times faster than built-in function array_intersect().. Give a try..
    <?php
    function my_array_intersect($a,$b)
    {
        for($i=0;$i<sizeof($a);$i++)
        {
            $m[]=$a[$i];
        }
        for($i=0;$i<sizeof($a);$i++)
        {
            $m[]=$b[$i];
        }
        sort($m);
        $get=array();
        for($i=0;$i<sizeof($m);$i++)
        {
            if($m[$i]==$m[$i+1])
            $get[]=$m[$i];
        }
        return $get;
    }
    ?>
    Barış ÇUHADAR
    189780@gmail.com
    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.
    Note that array_intersect() considers the type of the array elements when it compares them.
    If array_intersect() doesn't appear to be working, check your inputs using var_dump() to make sure you're not trying to intersect an array of integers with an array of strings.
    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));
    ?>
    
    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.
    Just a small mod to ben's code to make it work properly:
    <?php
    if(sort(array_unique($b + $a)) === sort($b))
     // $a is legit
    }
    ?>
    This is useful for checking for illegal characters in a username.
    Note... this function does not seem intuitive for doing intersection of flat arrays, in the sense that an intersection are common values between. This is an issue if you are doing a for loop over the results of an intersect function, as shown below, wherein the for loop iterates over something different depending on order.
    Below is example of a function whioch I think works correctly, the output from original function, and new function. 
    function array_value_mutual_intersection($array1, $array2)
    {
      $hashMap = array();
      $output = array();
      foreach($array1 as $item)
        $hashMap[$item] = '';
      foreach($array2 as $item)
        if(isset($hashMap[$item]))
          array_push($output, $item);
      return $output;
    }
    $a = ['one', 'two', 'three', 'four'];
    $b = ['three', 'two'];
    echo "Original array a = " . json_encode($a) . "\n";
    echo "Original array b = " . json_encode($b) . "\n";
    echo "PHP array_intersect says interesection of (a,b) is: " . json_encode(array_intersect($a,$b)) . "\n";
    echo "PHP array_intersect says interesection of (b,a) is: " . json_encode(array_intersect($b,$a)) . "\n\n";
    echo "My intersect function says intersection of (a,b) is: " . json_encode(array_value_mutual_intersection($a, $b)) . "\n";
    echo "My intersect function says intersection of (b,a) is: " . json_encode(array_value_mutual_intersection($b, $a)) . "\n\n";
    -------output------
    $ php test.php
    Original array a = ["one","two","three","four"]
    Original array b = ["three","two"]
    PHP array_intersect says interesection of (a,b) is: {"1":"two","2":"three"}
    PHP array_intersect says interesection of (b,a) is: ["three","two"]
    My intersect function says intersection of (a,b) is: ["three","two"]
    My intersect function says intersection of (b,a) is: ["two","three"]
    array_intersect($array1, $array2);
    returns the same as:
    array_diff($array1, array_diff($array1, $array2));
    I ran into a problem (PHP 5.6) with array_intersect(), though i had no idea it was it at the time : using it properly created an array to string conversion notice, through this type of code (and with both array variables verified) :
    <?php
    if(empty($var = array_intersect($array1, $array2))) {
    ?>
    Rewriting its supposed behaviour, even in a rather simple way, removed the notice. Not sure what caused the function to be unhappy but here's my code that works properly :
    <?php
    $var = [];
    foreach($array1 as $v) {
      if(in_array($v, $var)) continue; // value already found
      if(in_array($v, $array2)) $var[] = $v;
    }
    if(empty($var)) {
    ?>
    
    If you just need confirmation that there intersection (and will not use the return of the intersection). Just only returns a boolean.
    <?php 
      function eventsCodeIntersect() 
      {
        $eventsCod = array(211, 220, 244);
        $eventsIntersect = array(220, 244);
        return (bool) array_intersect($array1, $array2); 
      }
    ?>
    In this case, the return is true.
    Just a handy tip. 
    If you want to produce an array from two seperate arrays on their intersects, here you go:
    <?
    $a = array("branches","E_SHOP");
    $b = array("E_SHOP","Webdirector_1_0");
    print join("/",array_merge(array_diff($a, $b), array_intersect($a, $b), array_diff($b, $a)));
    ?>
    Gives you:
    /branches/E_SHOP/Webdirectory_1_0
    $a = array(1,2,3,4,5,2,6,1); /* repeated elements --> $a is not a set */
    $b = array(0,2,4,6,8,5,7,9,2,1); /* repeated elements --> $b is not a set */
    $ua = array_merge(array_unique($a)); /* now, $a is a set */
    $ub = array_merge(array_unique($b)); /* now, $b is a set */
    $intersect = array_merge(array_intersect($ua,$ub));
    Note: 'array_merge' removes blank spaces in the arrays.
    Note: order doesn't matter.
    In one line:
    $intersect_a_b = array_merge(array_intersect(array_merge(array_unique($a)), array_merge(array_unique($b))));
    Additions/corrections wellcome...
    gRiNgO
    Here's my approach to intersection returning only the values present in all the arrays.
    Note that each array must not contain duplicate values.
    I don't know how effective it actually is, but perhaps it could help. 
    <?php
    // $arrays - Array of arrays to intersect.
    function calculate_intersection($arrays)
      {
      $intersection = Array();
            
      for($checked_item = 0; $checked_item < count($arrays[0]); $checked_item++)
        {
        $occurrence = 1;
        
        for($compared_array = 1; $compared_array < count($arrays); $compared_array++)
          {      
          for($compared_item = 0; $compared_item < count($arrays[$compared_array]); $compared_item++)
            {
            if($arrays[0][$checked_item] == $arrays[$compared_array][$compared_item])
              {
              $occurrence++;
              if($occurrence == count($arrays))
                {
                $intersection[] = $arrays[0][$checked_item];
                }
              }
            }
          }
        }
      
      return $intersection;
      }
    ?>
    
    I needed an array_intersect that would delete the intersecting values from the original array. Voila:
    <?php
    // array_intersect that splits the needle array into two - one filled with "intersected" results, and one filled with the remainder
    function array_intersect_split(&$needle, $haystack, $preserve_keys = false) {
      if(!is_array($needle) || !is_array($haystack)) return false;
      $new_arr = array();
      foreach($needle as $key => $value) {
        if(($loc = array_search($value, $haystack))!==false) {
          if(!$preserve_keys) $new_arr[] = $value;
          else $new_arr[$key] = $value;
          unset($needle[$key]);
        }
      }
      return $new_arr;
    }
    ?>
    
    this one will work with associative arrays. also an overwrite function to only replace those elements in the first array.
    <?php
    function array_union()
    {
      if (func_num_args() < 2) { return; }
      $arrays = func_get_args();
      $outputArray = array_shift($arrays);
      $remaining = count($arrays);
      for ($i=0; $i<$remaining; $i++)
      {
        $nextArray = $arrays[$i];
        foreach ($nextArray as $key=>$value)
        {
          $outputArray[$key] = $value;
        }
      }
      return $outputArray;
    }
    function array_overwrite()
    {
      if (func_num_args() < 2) { return; }
      $arrays = func_get_args();
      $outputArray = array_shift($arrays);
      $remaining = count($arrays);
      for ($i=0; $i<$remaining; $i++)
      {
        $nextArray = $arrays[$i];
        foreach ($nextArray as $key=>$value)
        {
          if (array_key_exists($key, $outputArray)) {  $outputArray[$key] = $value; }
        }
      }
      return $outputArray;
    }
    ?>
    
    The reason that this function is considerably slow; is because it's comparing not only the values cross wise; but it also compares the array's own elements too.
    For example you have two arrays like;
    <?php
    $arr1 = array('green', 'blue', 'black');
    $arr2 = array('yellow', 'red', 'cyan');
    array_intersect($arr1, $arr2);
    ?>
    Intersection will start to compare from the first three colors like; "blue" to "green", "black" to "blue"; that are, the elements of the first array only, and yes, comparison order is arbitrary, but always in the same order.
    It will do the same for the second array too.