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.array_intersect
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
array_intersect
Референца за `function.array-intersect.php` со подобрена типографија и навигација.
array_intersect
(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)
array_intersect — Ги пресметува пресеците на низите
= NULL
array_intersect() враќа низа што ги содржи сите вредности од array
кои се присутни во сите аргументи. Забележете дека клучевите се зачувани.
Параметри
array-
Низата со главни вредности за проверка.
arrays-
Низи за споредба на вредностите против.
Вратени вредности
Враќа низа што ги содржи сите вредности во
array чии вредности постојат во сите параметри.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.0.0 | Оваа функција сега може да се повика само со еден параметар. Поранешно, беа потребни најмалку два параметри. |
Примери
Пример #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);
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
Array
(
[a] => green
[0] => red
)
Белешки
Забелешка: , тогаш клучот и вредноста на првиот еднаков елемент ќе бидат задржани.
(string) $elem1 === (string) $elem2. Со други зборови: кога нивната текстуална репрезентација е иста.
Види Исто така
- array_intersect_assoc() - Пресметува пресек на низи
- array_diff() - Ги пресметува разликите на низите
- array_diff_assoc() - Ги пресметува разликите на низите со дополнителна проверка на индекс
Белешки од корисници Пример #2 Пример на статичен имот
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.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
?>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.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)
?>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.056If 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);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;
}
?>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 =)
[]sTake 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)
}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, EExtending 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
?>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.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
)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...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 )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.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...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
?>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.