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
array_intersect
(PHP 4 >= 4.0.1, PHP 5)
array_intersect — 计算数组的交集
说明
array array_intersect
( array $array1
, array $array2
[, array $ ...
] )
array_intersect() 返回一个数组,该数组包含了所有在 array1 中也同时出现在所有其它参数数组中的值。注意键名保留不变。
Example#1 array_intersect() 例子
<?php
$array1 = array("a" => "green", "red", "blue");
$array2 = array("b" => "green", "yellow", "red");
$result = array_intersect($array1, $array2);
?>
这使得 $result 成为:
Array ( [a] => green [0] => red )
Note: 两个单元仅在 (string) $elem1 === (string) $elem2 时被认为是相同的。也就是说,当字符串的表达是一样的时候。
参见 array_intersect_assoc(),array_diff() 和 array_diff_assoc()。
array_intersect
Esfandiar -- e.bandari at gmail dot com
10-Aug-2008 03:44
10-Aug-2008 03:44
stuart at horuskol dot co dot uk
08-Jul-2008 06:57
08-Jul-2008 06:57
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.
Malte
11-Feb-2008 02:34
11-Feb-2008 02:34
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
?>
aaron
18-Dec-2006 01:36
18-Dec-2006 01:36
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;
}
?>
Niels
20-Sep-2006 07:53
20-Sep-2006 07:53
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
?>
nthitz at gmail dot com
09-Jun-2006 12:09
09-Jun-2006 12:09
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.
terry(-at-)shuttleworths(-dot-)net
07-Feb-2006 11:42
07-Feb-2006 11:42
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.
tom p
05-Nov-2005 10:54
05-Nov-2005 10:54
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"
?>
sapenov at gmail dot com
11-Jun-2005 04:11
11-Jun-2005 04:11
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);
SETS INTERSECTION
19-May-2005 02:19
19-May-2005 02:19
$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
drew at iws dot co dot nz
22-Apr-2005 11:04
22-Apr-2005 11:04
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
blu at dotgeek dot org
15-Oct-2004 08:34
15-Oct-2004 08:34
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
tompittlik at disfinite dot net
24-Jun-2004 09:27
24-Jun-2004 09:27
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.
t dot wiltzius at insightbb dot com
24-Jun-2004 12:33
24-Jun-2004 12:33
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 )
anbolb at boltblue dot com
10-Jan-2004 05:11
10-Jan-2004 05:11
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.
ben at kazez dot com
10-Dec-2003 02:49
10-Dec-2003 02:49
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.
Alessandro Ranellucci alex at primafila dot net
16-Jul-2003 09:35
16-Jul-2003 09:35
array_intersect($array1, $array2);
returns the same as:
array_diff($array1, array_diff($array1, $array2));
"inerte" is my hotmail.com username
27-Jun-2003 06:50
27-Jun-2003 06:50
If you have a slow database query that uses JOIN, try to array_intersect() the table records.
I hung up my server countless times before using this function. Simple select from one table and put the records in an array ($records_1), then select records from any other table and put them in another array($records_2).
array_intersect() will emulate a JOIN for you.
<?php
$emulated_join = array_intersect($records_1, $records_2);
?>
Remember to test if it really offers a speed improvement, your mileage may vary (database type, hardware, version, etc...)
You could also emulate a JOIN from two text files, reading each line with the file() function.
david at audiogalaxy dot com
10-Apr-2001 07:54
10-Apr-2001 07:54
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.
