©
Ce document utilise Manuel du site Web PHP chinois Libérer
(PHP 5 >= 5.1.0, PHP 7)
array_intersect_ukey — 用回调函数比较键名来计算数组的交集
$array1
, array $array2
[, array $...
], callable $key_compare_func
) array_intersect_ukey() 返回一个数组,该数组包含了所有出现在
array1
中并同时出现在所有其它参数数组中的键名的值。
array1
Initial array for comparison of the arrays.
array2
First array to compare keys against.
array
Variable list of array arguments to compare keys against.
key_compare_func
在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数。
$a
, mixed $b
)
Returns the values of array1
whose keys exist
in all the arguments.
Example #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'
的值在两个数组中是不同的。但因为只检查键名,因此还是匹配。返回的值只是
array1
中的。
[#1] gk at anuary dot com [2013-09-30 16:52:10]
"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);
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));
}
?>