相交(内部连接)两个具有不同键名的数组
Intersect (inner join) two arrays with different key names
我有以下两个多维数组:
第一个数组:
$array_1_data = Array (
[0] => Array ( [id] => 1 [name] => IT [slug] => it )
[1] => Array ( [id] => 2 [name] => Accounting [slug] => accounting )
)
第二个数组:
$array_2_data = Array (
[0] => Array ( [cid] => 3 [jid] => 24061 )
[1] => Array ( [cid] => 1 [jid] => 24062 )
)
预期结果:
$some_array = Array (
[0] => Array ( [id] => 1 [name] => IT [slug] => it )
)
我不介意结果中有 [cid]
。
我想将这两个数组与第一个数组的 [id]
和第二个数组的 [cid]
相交,就像 MySQL 中的内连接一样。为此,我有基本的 foreach
和 if else
逻辑,但现在速度是重中之重,所以我正在寻找非循环解决方案。为了更好地理解这里是基本的循环解决方案:
foreach ($array_1_data as $array_1_row ) {
foreach ($array_2_data as $array_2_row ) {
if ($array_2_row['cid'] == $array_1_row['id']) {
//intersection iteration
}
}
}
我试过 array_uintersection
如下:
array_uintersect($array_1_data, $array_2_data, function($a1, $a2){
$diff1 = strcasecmp($a1['id'], $a2['cid']);
if ($diff1 != 0) return $diff1;
return 0;
});
但它给了我未定义的索引 'id'。我检查了这个问题:Comparing two arrays with different key names。这个问题的第一个答案给出了一个我想避免的循环解决方案。第二个答案建议更改 SQL 结构,但我无法控制它。所以,
这种情况真的有非循环的快速解决方案吗?
使用array_uintersect_uassoc
函数的解决方案:
$result = array_uintersect_uassoc($array_1_data, $array_2_data, function($a, $b){
return strcasecmp($a['id'], $b['cid']);
}, function($a, $b){
return (int) [$a, $b] == ['id', 'cid'];
});
print_r($result);
输出:
Array
(
[0] => Array
(
[id] => 1
[name] => IT
[slug] => it
)
)
根据你的条件:通过第一个数组的 [id] 和 [cid[=32= 将这两个数组相交]] 的第二个数组 ,我们应该考虑一个 键比较函数 仅用于那些键 ['id', 'cid']
.
在每个比较步骤中都有所需的键,只剩下比较它们的值(使用值比较函数)
http://php.net/manual/en/function.array-uintersect-uassoc.php
我有以下两个多维数组:
第一个数组:
$array_1_data = Array (
[0] => Array ( [id] => 1 [name] => IT [slug] => it )
[1] => Array ( [id] => 2 [name] => Accounting [slug] => accounting )
)
第二个数组:
$array_2_data = Array (
[0] => Array ( [cid] => 3 [jid] => 24061 )
[1] => Array ( [cid] => 1 [jid] => 24062 )
)
预期结果:
$some_array = Array (
[0] => Array ( [id] => 1 [name] => IT [slug] => it )
)
我不介意结果中有 [cid]
。
我想将这两个数组与第一个数组的 [id]
和第二个数组的 [cid]
相交,就像 MySQL 中的内连接一样。为此,我有基本的 foreach
和 if else
逻辑,但现在速度是重中之重,所以我正在寻找非循环解决方案。为了更好地理解这里是基本的循环解决方案:
foreach ($array_1_data as $array_1_row ) {
foreach ($array_2_data as $array_2_row ) {
if ($array_2_row['cid'] == $array_1_row['id']) {
//intersection iteration
}
}
}
我试过 array_uintersection
如下:
array_uintersect($array_1_data, $array_2_data, function($a1, $a2){
$diff1 = strcasecmp($a1['id'], $a2['cid']);
if ($diff1 != 0) return $diff1;
return 0;
});
但它给了我未定义的索引 'id'。我检查了这个问题:Comparing two arrays with different key names。这个问题的第一个答案给出了一个我想避免的循环解决方案。第二个答案建议更改 SQL 结构,但我无法控制它。所以,
这种情况真的有非循环的快速解决方案吗?
使用array_uintersect_uassoc
函数的解决方案:
$result = array_uintersect_uassoc($array_1_data, $array_2_data, function($a, $b){
return strcasecmp($a['id'], $b['cid']);
}, function($a, $b){
return (int) [$a, $b] == ['id', 'cid'];
});
print_r($result);
输出:
Array
(
[0] => Array
(
[id] => 1
[name] => IT
[slug] => it
)
)
根据你的条件:通过第一个数组的 [id] 和 [cid[=32= 将这两个数组相交]] 的第二个数组 ,我们应该考虑一个 键比较函数 仅用于那些键 ['id', 'cid']
.
在每个比较步骤中都有所需的键,只剩下比较它们的值(使用值比较函数)
http://php.net/manual/en/function.array-uintersect-uassoc.php