International PHP Conference Berlin 2025

array_intersect_ukey

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

array_intersect_ukeyВычисляет пересечение массивов, используя callback-функцию для сравнения ключей

Описание

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

Функция array_intersect_ukey() возвращает массив, состоящий из значений массива array, ключи которых содержатся во всех аргументах.

Список параметров

array

Основной проверяемый массив.

arrays

Массивы, с которыми сравниваются ключи.

key_compare_func

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.

callback(mixed $a, mixed $b): int
Предостережение

Возвращение нецелых значений из функции сравнения, таких как число с плавающей точкой (float), приведёт к внутреннему приведению возвращаемого значения callback-функции к целому числу (int). Таким образом, значения 0.99 и 0.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.

Смотрите также

  • array_diff() - Вычисляет расхождение массивов
  • array_udiff() - Вычисляет расхождение массивов, используя для сравнения callback-функцию
  • array_diff_assoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса
  • array_diff_uassoc() - Вычисляет расхождение массивов с дополнительной проверкой индекса через пользовательскую callback-функцию
  • array_udiff_assoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_udiff_uassoc() - Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию
  • array_diff_key() - Вычисляет расхождение массивов, сравнивая ключи
  • array_diff_ukey() - Вычисляет расхождение массивов, используя callback-функцию для сравнения ключей
  • array_intersect() - Вычисляет пересечение массивов
  • array_intersect_assoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса
  • array_intersect_uassoc() - Вычисляет пересечение массивов с дополнительной проверкой индекса, сравнивая индексы через callback-функцию
  • array_intersect_key() - Вычисляет пересечение массивов, сравнивая ключи

Добавить

Примечания пользователей 1 note

up
0
gk at anuary dot com
11 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