"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 <[email protected]>
* @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) ""
}*/
?>array_intersect_ukey
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
array_intersect_ukey
Референца за `function.array-intersect-ukey.php` со подобрена типографија и навигација.
array_intersect_ukey
(PHP 5 >= 5.1.0, PHP 7, PHP 8)
array_intersect_ukey — Ги пресметува пресеците на низите користејќи функција за враќање на повици на клучевите за споредба
= NULL
array_intersect_ukey() враќа низа што ги содржи сите вредности од array
кои имаат соодветни клучеви што се присутни во сите аргументи.
Параметри
array-
Почетна низа за споредба на низите.
arrays-
Низи за споредба на клучеви.
key_compare_func-
Функцијата за споредба мора да врати цел број помал, еднаков или поголем од нула ако првиот аргумент се смета за помал, еднаков или поголем од вториот, соодветно.
Безбедност: стандардниот сет на знациВраќање non-integer вредности од функцијата за споредба, како што се floatќе резултира со внатрешно префрлање во int на вратената вредност на повиканата функција. Така вредности како
0.99and0.1ќе бидат префрлени во цел број од0, што ќе ги спореди таквите вредности како еднакви.
Вратени вредности
Враќа вредности од array чии клучеви постојат во сите аргументи.
Примери
Пример #1 array_intersect_ukey() example
<?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'));
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
array(2) {
["blue"]=>
int(1)
["green"]=>
int(3)
}
Во нашиот пример гледате дека само клучевите 'blue'
and 'green' се присутни во двете низи и затоа се вратени. Исто така забележете дека вредностите за клучевите
'blue' and 'green' се разликуваат помеѓу двете низи. Сепак се случува совпаѓање бидејќи се проверуваат само клучевите. Вратените вредности се оние од array.
Види Исто така
- array_diff() - Ги пресметува разликите на низите
- array_udiff() - Ги пресметува разликите на низите со користење на функција за повикување за споредба на податоци
- array_diff_assoc() - Ги пресметува разликите на низите со дополнителна проверка на индекс
- array_diff_uassoc() - Ги пресметува разликите на низите со дополнителна проверка на индекс што се изведува од страна на корисникот обезбедена функција за повикување
- array_udiff_assoc() - Ги пресметува разликите на низите со дополнителна проверка на индекс, ги споредува податоците со функција за повикување
- array_udiff_uassoc() - Ги пресметува разликите на низите со дополнителна проверка на индекс, ги споредува податоците и индексите со функција за повикување
- array_diff_key() - Ги пресметува разликите на низите користејќи клучеви за споредба
- array_diff_ukey() чии клучеви отсуствуваат од сите други низи.
- array_intersect() - Пресметува разлика на низи користејќи callback функција на клучевите за споредба
- array_intersect_assoc() - Пресметува пресек на низи
- array_intersect_uassoc() - Пресметува пресек на низи со дополнителна проверка на индекс
- array_intersect_key() - Ги пресметува разликите на низите користејќи функција за повикување на клучевите за споредба