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

时间:2016-09-08 05:29:44

标签: 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 ( [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中的内连接一样。为此目的,我有基本的foreachif 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结构,但我无法控制它。所以,

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

1 个答案:

答案 0 :(得分:2)

使用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 ]交叉这两个数组 ,我们应该只为那些键['id', 'cid']考虑一个键比较函数 在每个比较步骤中拥有所需的键只能比较它们的值(使用值比较函数

http://php.net/manual/en/function.array-uintersect-uassoc.php

DEMO link