To return the unique elements (those with a key that exists only once in either array but not in both) try:
function array_unique_diff ($array1, $array2)
{
array_merge(array_diff_key($array1, $array2), array_diff_key($array2, $array1));
}
Example:
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8);
array_diff_key($array1, $array2)
returns
array ( 'red' => 2, 'purple' => 4 )
array_diff_key($array2, $array1)
returns
array ( 'yellow' => 7, 'cyan' => 8, )
array_unique_diff($array1, $array2);
returns
array ( 'red' => 2, 'purple' => 4, 'yellow' => 7, 'cyan' => 8, )array_diff_key
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
array_diff_key
Референца за `function.array-diff-key.php` со подобрена типографија и навигација.
array_diff_key
(PHP 5 >= 5.1.0, PHP 7, PHP 8)
array_diff_key — Computes the difference of arrays using keys for comparison
= NULL
Ги пресметува разликите на низите користејќи ги клучевите за споредба array Ги споредува клучевите од arrays спрема клучевите од array_diff() и ги враќа разликите. Оваа функција е слична на
Параметри
array-
клучовите на низата исто така се користат во споредбата.
arrays-
Низата од која треба да се спореди
Вратени вредности
Враќа array што ги содржи сите внесувања од
array освен што споредбата се прави на клучевите наместо на вредностите.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.0.0 | Оваа функција сега може да се повика само со еден параметар. Поранешно, беа потребни најмалку два параметри. |
Примери
Пример #1 array_diff_key() example
Двата клуча од key => value паровите се сметаат за еднакви само ако
(string) $key1 === (string) $key2 . Со други зборови, се извршува строга проверка на типот, така што низата на претставување мора да биде иста.
<?php
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'yellow' => 7, 'cyan' => 8);
var_dump(array_diff_key($array1, $array2));
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
array(3) {
["blue"]=>
int(1)
["red"]=>
int(2)
["purple"]=>
int(4)
}
<?php
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'yellow' => 7, 'cyan' => 8);
$array3 = array('blue' => 6, 'yellow' => 7, 'mauve' => 8);
var_dump(array_diff_key($array1, $array2, $array3));
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
array(2) {
["red"]=>
int(2)
["purple"]=>
int(4)
}
Белешки
Забелешка:
Оваа функција проверува само една димензија на n-димензионална низа. Се разбира, можете да проверите подлабоки димензии со користење на
array_diff_key($array1[0], $array2[0]);.
Види Исто така
- array_diff() - Ги пресметува разликите на низите
- array_udiff() - Ги пресметува разликите на низите со користење на функција за повикување за споредба на податоци
- array_diff_assoc() - Ги пресметува разликите на низите со дополнителна проверка на индекс
- array_diff_uassoc() - Ги пресметува разликите на низите со дополнителна проверка на индекс што се изведува од страна на корисникот обезбедена функција за повикување
- array_udiff_assoc() - Ги пресметува разликите на низите со дополнителна проверка на индекс, ги споредува податоците со функција за повикување
- array_udiff_uassoc() - Ги пресметува разликите на низите со дополнителна проверка на индекс, ги споредува податоците и индексите со функција за повикување
- array_diff_ukey() чии клучеви отсуствуваат од сите други низи.
- array_intersect() - Пресметува разлика на низи користејќи callback функција на клучевите за споредба
- array_intersect_assoc() - Пресметува пресек на низи
- array_intersect_uassoc() - Пресметува пресек на низи со дополнителна проверка на индекс
- array_intersect_key() - Ги пресметува разликите на низите користејќи функција за повикување на клучевите за споредба
- array_intersect_ukey() - Пресметува пресек на низи со дополнителна проверка на индекс, ги споредува индексите со callback функција
Белешки од корисници 10 белешки
Improved recursive version.
<?php
/**
* @author Gajus Kuizinas <[email protected]>
* @version 1.0.0 (2013 03 19)
*/
function array_diff_key_recursive (array $arr1, array $arr2) {
$diff = array_diff_key($arr1, $arr2);
$intersect = array_intersect_key($arr1, $arr2);
foreach ($intersect as $k => $v) {
if (is_array($arr1[$k]) && is_array($arr2[$k])) {
$d = array_diff_key_recursive($arr1[$k], $arr2[$k]);
if ($d) {
$diff[$k] = $d;
}
}
}
return $diff;
}
?>
An up to date version is maintained at https://github.com/gajus/flow/blob/master/flow.inc.php#L337.I needed something a little different where maybe even the keys in multidimensional arrays don't match up. Setting $assoc to false will cause only to check for missing keys, otherwise it compares values as well. This was also based on '2ge at 2ge dot us' function
<?php
function n_array_diff_assoc ($a1, $a2, $assoc=true) {
$r = array();
if(is_array(current($a1))):
foreach($a1 as $k => $v):
if(isset($a2[$k])):
$diff = n_array_diff($a1[$k], $a2[$k], $assoc);
if (!empty($diff)):
$r[$k] = $diff;
endif;
else:
$r[$k] = $v;
endif;
endforeach;
else:
$r = $assoc ? array_diff_assoc($a1, $a2) : array_diff_key($a1, $a2);
endif;
return $r;
}
?>Seems to be a great function, especially for n-dimensions arrays. The only problem is that I cannot find it in php 5.0.3 and 5.0.4. Does it really exist ?! :(
[20:27:05][maxence@conurb] ~/test2/php-5.0.4$ grep PHP_FUNCTION * -r | grep -i array_diff_key
[20:27:09][maxence@conurb] ~/test2/php-5.0.4$The recursive function suggested by '2ge at 2ge dot us' will provide you with empty arrays if there's no diff.
This variant of the function cleans up empty arrays and fixes a bug in the first suggested version. It works 100%
.
<?php
function array_diff_key_recursive ($a1, $a2) {
foreach($a1 as $k => $v) {
//$r[$k] = is_array($v) ? $this->array_diff_key_recursive($a1[$k], $a2[$k]) : array_diff_key($a1, $a2);
if (is_array($v))
{
$r[$k]=$this->array_diff_key_recursive($a1[$k], $a2[$k]);
}else
{
$r=array_diff_key($a1, $a2);
}
if (is_array($r[$k]) && count($r[$k])==0)
{
unset($r[$k]);
}
}
return $r;
}
?>The PHP4 version below works only unidirectionally. If you switch the arrays around i.e. (ar2, ar1) you get different results than (ar1, ar2).Here's a simple function that returns true if all keys in the first array are found in the second array, and false if they aren't.
function same_keys ($a1, $a2) {
$same = false;
if (!array_diff_key($a1, $a2)) {
$same = true;
foreach ($a1 as $k => $v) {
if (is_array($v) && !same_keys($v, $a2[$k])) {
$same = false;
break;
}
}
}
return $same;
}
To check if two arrays have the same structure, ignoring values, execute the function twice, the second time with the arguments reversed.Well, you could implement in the code something more powerfull:
http://www.php.net/manual/en/function.array-diff.php#31364you can use this function for return the difference of two array !
<?php
function array_unique_diff_key ($array1, $array2)
{
if (is_array($array1) && is_array($array2))
return array_diff_key($array1, $array2) + array_diff_key($array2, $array1);
else if (is_array($array1)) return $array1;
else if (is_array($array2)) return $array2;
else return array();
}
?>One more alternative variant :)
<?
if (!function_exists('array_diff_key')) {
function array_diff_key() {
$argCount = func_num_args();
$diff_arg_prefix = 'diffArg';
$diff_arg_names = array();
for ($i=0; $i < $argCount; $i++) {
$diff_arg_names[$i] = 'diffArg'.$i;
$$diff_arg_names[$i] = array_keys((array)func_get_arg($i));
}
$diffArrString = '';
if (!empty($diff_arg_names)) $diffArrString = '$'.implode(', $', $diff_arg_names);
eval("\$result = array_diff(".$diffArrString.");");
return $result;
}
}
?>