Php 相交(内部连接)两个具有不同键名的数组

Php 相交(内部连接)两个具有不同键名的数组,php,arrays,multidimensional-array,associative-array,intersection,Php,Arrays,Multidimensional Array,Associative Array,Intersection,我有以下两个多维数组: 第一个阵列: $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

我有以下两个多维数组:

第一个阵列:

$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\u uinterction
,如下所示:

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”。我检查了这个问题:。这个问题的第一个答案给出了一个我想要避免的循环解决方案。第二个答案建议更改SQL结构,但我无法控制它。所以


对于这种情况,真的有一种非循环的快速解决方案吗?

使用
array\u uintercast\u 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
        )
)
根据你的条件:通过第二个数组的[1]的“强> ID /强>”和[第二个数组的“强> CID>],我们应该考虑这些键的键比较函数,只是代码> [ ID ','CID ' 在每个比较步骤上都有所需的键,只剩下比较它们的值(使用值比较功能)


您能说明预期结果的外观吗?在
数组中
可以使用同一数组中的元素调用该函数。这就是它出错的原因,因为它们没有
id
cid
。您可以将
id
元素添加到第二个数组中,使其成为
cid
的副本,然后使用
array\u uintersect
。我认为没有任何内置的东西可以满足您的需要。为什么不在查询数据库时执行联接呢?@Barmar:这些是第三方生成的数组,我没有SQL控件。@JanakaDombawela,添加了一些解释检查代码中的错误并注意我的演示链接