文字

array_intersect_ukey

(PHP 5 >= 5.1.0, PHP 7)

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

说明

array array_intersect_ukey ( array $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 的整数。

int callback ( mixed $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 中的。

参见

  • 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() - 使用键名比较计算数组的交集

用户评论:

[#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) > : -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($args02, [$arr_unmatched]);
    
    return 
array_merge($arr_matchedcall_user_func_array('_array_intersect_ukey'$args));
}


?>

上一篇: 下一篇: