php[tek] 2018 : Call for Speakers

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

比較元となる最初の配列。

array2

キーを比較する対象となる最初の配列。

...

キーを比較する対象となる配列の、可変リスト。

key_compare_func

比較関数は、最初の引数と二番目の引数の比較結果を返します。最初の引数のほうが二番目の引数より大きい場合は正の数を、二番目の引数と等しい場合はゼロを、そして二番目の引数より小さい場合は負の数を返す必要があります。PHP 7.0.0 より前のバージョンでは、この整数が -2147483648 から 2147483647 までの範囲におさまる必要がありました。

int callback ( mixed $a, mixed $b )

返り値

array1 の値のうち、 すべての引数に存在するキーのものを含む連想配列を返します。

例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() - キーを基準にして配列の共通項を計算する

add a note add a note

User Contributed Notes 1 note

up
1
gk at anuary dot com
4 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) ""
}*/
?>
To Top