array_intersect_ukey()
(PHP 5 >= 5.1.0, PHP 7)
用回调函数比较键名来计算数组的交集
说明
array_intersect_ukey(array $array1,array $array2[,array $...],callable$key_compare_func): array
array_intersect_ukey()返回一个数组,该数组包含了所有出现在$array1中并同时出现在所有其它参数数组中的键名的值。
参数
- $array1
Initial array for comparison of the arrays.
- $array2
First array to compare keys against.
Variable list of array arguments to compare keys against.
- $key_compare_func
在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数。
callback(mixed $a,mixed $b): int
返回值
Returns the values of$array1whose keys exist in all the arguments.
范例
Example #1array_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中的。
参见
array_diff()
计算数组的差集array_udiff()
用回调函数比较数据来计算数组的差集array_diff_assoc()
带索引检查计算数组的差集array_diff_uassoc()
用用户提供的回调函数做索引检查来计算数组的差集array_udiff_assoc()
带索引检查计算数组的差集,用回调函数比较数据array_udiff_uassoc()
带索引检查计算数组的差集,用回调函数比较数据和索引array_diff_key()
使用键名比较计算数组的差集array_diff_ukey()
用回调函数对键名比较计算数组的差集array_intersect()
计算数组的交集array_intersect_assoc()
带索引检查计算数组的交集array_intersect_uassoc()
带索引检查计算数组的交集,用回调函数比较索引array_intersect_key()
使用键名比较计算数组的交集
"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) "" }*/ ?>