PHP 8.4.23 Released!

array_intersect_ukey

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

array_intersect_ukey在键名上使用回调函数来比较计算数组的交集

说明

function array_intersect_ukey(array $array, array ...$arrays, callable $key_compare_func): array

array_intersect_ukey() 返回一个数组,该数组包含了所有在 array 和其它参数数组中同时存在的键名的值。

参数

array

用于数组比较的初始数组。

arrays

用于比较键的数组。

key_compare_func
在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数。
function callback(mixed $a, mixed $b): int
警告

从比较函数中返回非整数值,例如 float ,将导致内部强制转换为 callback 返回值为 int 。因此,诸如 0.990.1 之类的值都将被转换为整数值 0,将这些值比较的话将会是相等。

返回值

返回 array 的值,其键名同时存在于所有参数数组中。

示例

示例 #1 array_intersect_ukey() 例子

<?php
function key_compare_func($key1, $key2)
{
 if ($key1 == $key2)
 return 0;
 else if ($key1 > $key2)
 return 1;
 else
 return -1;
}
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8);
var_dump(array_intersect_ukey($array1, $array2, 'key_compare_func'));
?>

以上示例会输出:

array(2) {
 ["blue"]=>
 int(1)
 ["green"]=>
 int(3)
}

上例中可以看到,只有 'blue''green' 两个键名出现在两个数组中,因此被返回。另外注意 'blue''green' 的值在两个数组中是不同的。但因为只检查键名,因此还是匹配。返回的是 array 中的值。

参见

发现了问题?

了解如何改进此页面提交拉取请求报告一个错误
+添加备注

用户贡献的备注 1 note

up
0
gk at anuary dot com
12 years ago
"array_intersect_ukey" will not work if $key_compare_func is using regular expression to perform comparison. "_array_intersect_ukey" fully implements the "array_intersect_ukey" interface and handles properly boolean comparison. However, the native implementation should be preferred for efficiency reasons.
<?php
$key_compare_func = function ($a, $b) {
 var_dump('a=' . $a. '; b=' . $b);
 
 if (strpos($b, '/') === 0) {
 return preg_match($b, $a) > 0 ? 0 : -1;
 }
 
 if ($a == $b) {
 $weight = 0;
 } else if ($a > $b) {
 $weight = 1;
 } else {
 $weight = -1;
 }
 
 var_dump('literal comparison: ' . $weight);
 
 return $weight;
};
$foo = ['aab' => '', 'bbb' => '', 'ccb' => '', 'abb' => ''];
$bar = ['/[a-z]b[a-z]/' => ''];
$buz = ['/c[a-z][a-z]/' => ''];
echo PHP_EOL . 'array_intersect_ukey' . PHP_EOL . PHP_EOL;
$subject = array_intersect_ukey ($foo, $bar, $buz, $key_compare_func);
echo PHP_EOL;
var_dump($subject);
echo PHP_EOL . '_array_intersect_ukey' . PHP_EOL . PHP_EOL;
$subject = _array_intersect_ukey($foo, $bar, $buz, $key_compare_func);
echo PHP_EOL;
var_dump($subject);
/**
 * @author Gajus Kuizinas <gk@anuary.com>
 * @version 1.0.0 (2013 09 30)
 * @url https://gist.github.com/gajus/271ad5f36337a32a184c
 */
function _array_intersect_ukey (array $arr1, array $arr2, $key_compare_func) {
 $arr_matched = [];
 $arr_unmatched = [];
 
 $args = func_get_args();
 
 $key_compare_func = end($args);
 
 foreach ($arr1 as $k1 => $v1) {
 foreach ($arr2 as $k2 => $v2) {
 $diff = $key_compare_func($k1, $k2);
 
 //var_dump('k1=' . $k1 . ', k2=' . $k2 . ', diff=' . $diff);
 
 if ($diff === 0) {
 $arr_matched[$k1] = $v1;
 } else {
 $arr_unmatched[$k1] = $v1;
 }
 }
 }
 
 if (count($args) <= 3) {
 return $arr_matched;
 }
 
 array_splice($args, 0, 2, [$arr_unmatched]);
 
 return array_merge($arr_matched, call_user_func_array('_array_intersect_ukey', $args));
}
/*
array_intersect_ukey
string(12) "a=bbb; b=aab"
string(21) "literal comparison: 1"
string(12) "a=bbb; b=ccb"
string(22) "literal comparison: -1"
string(12) "a=abb; b=bbb"
string(22) "literal comparison: -1"
string(12) "a=aab; b=abb"
string(22) "literal comparison: -1"
string(22) "a=aab; b=/[a-z]b[a-z]/"
string(22) "a=abb; b=/[a-z]b[a-z]/"
string(22) "a=abb; b=/c[a-z][a-z]/"
array(0) {
}
_array_intersect_ukey
string(22) "a=aab; b=/[a-z]b[a-z]/"
string(22) "a=bbb; b=/[a-z]b[a-z]/"
string(22) "a=ccb; b=/[a-z]b[a-z]/"
string(22) "a=abb; b=/[a-z]b[a-z]/"
string(22) "a=aab; b=/c[a-z][a-z]/"
string(22) "a=ccb; b=/c[a-z][a-z]/"
array(3) {
 ["bbb"]=>
 string(0) ""
 ["abb"]=>
 string(0) ""
 ["ccb"]=>
 string(0) ""
}*/
?>
+添加备注

AltStyle によって変換されたページ (->オリジナル) /