Php 多维关联数组交集

Php 多维关联数组交集,php,multidimensional-array,Php,Multidimensional Array,我有两个多维数组 $array1 = Array ( [a1] => Array ( [a_name] => aaaaa [a_value] => aaa ) [b1] => Array ( [b_name] => bbbbb [b_value] => bbb ) [c1] => Array (

我有两个多维数组

$array1 = Array (
   [a1] => Array  (
           [a_name] => aaaaa
           [a_value] => aaa
         )

   [b1] => Array (
           [b_name] => bbbbb
           [b_value] => bbb
       )
   [c1] => Array (
           [c_name] => ccccc
           [c_value] => ccc
       )

 )

$array2 = Array (
     [b1] => Array (
           [b_name]=> zzzzz
         )
  )
我想要
$array1
$array2
的键的交点。结果必须来自
$array1

$output = array_intersect_key($array1, $array2);

演示。

我认为您应该检查$array2[$key]是否也是一个数组

function recursive_array_intersect_key(array $array1, array $array2) {
    $array1 = array_intersect_key($array1, $array2);
    foreach ($array1 as $key => &$value) {
        if (is_array($value) && is_array($array2[$key])) {
            $value = recursive_array_intersect_key($value, $array2[$key]);
        }
    }
    return $array1;
}
PHP中二维关联数组交集的演示 代码:

<?php
    function compare_states($a1, $a2){
        $diff1 = strcasecmp($a1['state_id'], $a2['state_id']);
        $diff2 = strcasecmp($a1['state_name'], $a2['state_name']);
        if ($diff1 != 0) return $diff1;
        if ($diff2 != 0) return $diff2;
        return 0;
    }
    function calculate_intersection($a1, $a2){
        return array_uintersect($a1, $a2, 'compare_states');
    }
?>
<?php
    $a = Array(Array("state_id"=>14, "state_name"=>"Illinois"));
    $b = Array(Array("state_id"=>14, "state_name"=>"Illinois"));
    $new = calculate_intersection($a, $b);
    print_r($a);
    //in this simple case, the intersection is equivalent to $a.
    $a = Array(Array("state_id"=>14, "state_name"=>"Illinois"));
    $b = Array(Array("state_id"=>14, "state_name"=>"Foobar"));
    $new = calculate_intersection($a, $b);
    print_r($a);
    //in this case, the intersection is empty.
?>
$a = Array();
$b = Array();
$new = calculate_intersection($a, $b);
print "\nGroup1\n";
print ((count($new) == count($a) && count($a) == count($b)) ? "." : "FAIL");
print ((count($new) == 0) ? "." : "FAIL");
//==============================================
$a = Array(Array("state_id"=>14, "state_name"=>"Illinois"));
$b = Array(Array("state_id"=>14, "state_name"=>"Illinois"));
$new = calculate_intersection($a, $b);
print "\nGroup2\n";
print ((count($new) == count($a) && count($a) == count($b)) ? "." : "FAIL");
print ((count($new) == 1) ? "." : "FAIL");
print (($new[0]['state_id'] == 14 ? "." : "FAIL"));
print (($new[0]['state_name'] == "Illinois" ? "." : "FAIL"));
//==============================================
print "\nGroup3\n";
$a = Array(Array("state_id"=>14, "state_name"=>"Illinois"), Array("state_id"=> "22", "state_name"=>"Massachusetts"));
$b = Array(Array("state_id"=>14, "state_name"=>"Illinois"), Array("state_id"=> "22", "state_name"=>"Massachusetts"));
$new = calculate_intersection($a, $b);
print ((count($new) == count($a) && count($a) == count($b)) ? "." : "FAIL");
print (($new[0]['state_id'] == 14 ? "." : "FAIL"));
print (($new[0]['state_name'] == "Illinois" ? "." : "FAIL"));
print (($new[1]['state_id'] == 22 ? "." : "FAIL"));
print (($new[1]['state_name'] == "Massachusetts" ? "." : "FAIL"));
//==============================================
$a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"));
$b = Array(Array("state_id"=>"22", "state_name"=>"Massachusetts"));
$new = calculate_intersection($a, $b);
print "\nGroup5\n";
print ((count($new) == 0) ? "." : "FAIL");
//==============================================
$a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"));
$b = Array(Array("state_id"=>"14", "state_name"=>"Illinois"), Array("state_id"=>"22", "state_name"=>"Massachusetts"));
$new = calculate_intersection($a, $b);
print "\nGroup6\n";
print ((count($new) == 1) ? "." : "FAIL");
print (($new[0]['state_id'] == 14) ? "." : "FAIL");
print (($new[0]['state_name'] == "Illinois") ? "." : "FAIL");
//==============================================
$a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"));
$b = Array(Array("state_id"=>"22", "state_name"=>"Massachusetts"), Array("state_id"=>"14", "state_name"=>"Illinois"));
$new = calculate_intersection($a, $b);
print "\nGroup7\n";
print ((count($new) == 1) ? "." : "FAIL");
print (($new[0]['state_id'] == 14) ? "." : "FAIL");
print (($new[0]['state_name'] == "Illinois") ? "." : "FAIL");
//==============================================
$a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"));
$b = Array(Array("state_id"=>"22", "state_name"=>"Massachusetts"), Array("state_id"=>"14", "state_name"=>"Fromulate"));
$new = calculate_intersection($a, $b);
print "\nGroup8\n";
print ((count($new) == 0) ? "." : "FAIL");
//==============================================
$a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"), Array("state_id"=>"14", "state_name"=>"Illinois"));
$b = Array(Array("state_id"=>"14", "state_name"=>"Illinois"), Array("state_id"=>"14", "state_name"=>"Illinois"));
$new = calculate_intersection($a, $b);
print "\nGroup9\n";
print ((count($new) == 2) ? "." : "FAIL");
print (($new[0]['state_id'] == 14) ? "." : "FAIL");
print (($new[0]['state_name'] == "Illinois") ? "." : "FAIL");
print (($new[1]['state_id'] == 14) ? "." : "FAIL");
print (($new[1]['state_name'] == "Illinois") ? "." : "FAIL");
//==============================================
$a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"), Array("state_id"=>"22", "state_name"=>"Massachusetts"));
$b = Array(Array("state_id"=>"22", "state_name"=>"Massachusetts"), Array("state_id"=>"14", "state_name"=>"Illinois"));
$new = calculate_intersection($a, $b);
print "\nGroup7\n";
print ((count($new) == 2) ? "." : "FAIL");
print (($new[0]['state_id'] == 14) ? "." : "FAIL");
print (($new[0]['state_name'] == "Illinois") ? "." : "FAIL");
print (($new[1]['state_id'] == 22) ? "." : "FAIL");
print (($new[1]['state_name'] == "Massachusetts") ? "." : "FAIL");
?>
eric@dev $ php a.php
Group1
..
Group2
....
Group3
.....
Group5
.
Group6
...
Group7
...
Group8
.
Group9
.....
Group7
.....
以上代码打印:

<?php
    function compare_states($a1, $a2){
        $diff1 = strcasecmp($a1['state_id'], $a2['state_id']);
        $diff2 = strcasecmp($a1['state_name'], $a2['state_name']);
        if ($diff1 != 0) return $diff1;
        if ($diff2 != 0) return $diff2;
        return 0;
    }
    function calculate_intersection($a1, $a2){
        return array_uintersect($a1, $a2, 'compare_states');
    }
?>
<?php
    $a = Array(Array("state_id"=>14, "state_name"=>"Illinois"));
    $b = Array(Array("state_id"=>14, "state_name"=>"Illinois"));
    $new = calculate_intersection($a, $b);
    print_r($a);
    //in this simple case, the intersection is equivalent to $a.
    $a = Array(Array("state_id"=>14, "state_name"=>"Illinois"));
    $b = Array(Array("state_id"=>14, "state_name"=>"Foobar"));
    $new = calculate_intersection($a, $b);
    print_r($a);
    //in this case, the intersection is empty.
?>
$a = Array();
$b = Array();
$new = calculate_intersection($a, $b);
print "\nGroup1\n";
print ((count($new) == count($a) && count($a) == count($b)) ? "." : "FAIL");
print ((count($new) == 0) ? "." : "FAIL");
//==============================================
$a = Array(Array("state_id"=>14, "state_name"=>"Illinois"));
$b = Array(Array("state_id"=>14, "state_name"=>"Illinois"));
$new = calculate_intersection($a, $b);
print "\nGroup2\n";
print ((count($new) == count($a) && count($a) == count($b)) ? "." : "FAIL");
print ((count($new) == 1) ? "." : "FAIL");
print (($new[0]['state_id'] == 14 ? "." : "FAIL"));
print (($new[0]['state_name'] == "Illinois" ? "." : "FAIL"));
//==============================================
print "\nGroup3\n";
$a = Array(Array("state_id"=>14, "state_name"=>"Illinois"), Array("state_id"=> "22", "state_name"=>"Massachusetts"));
$b = Array(Array("state_id"=>14, "state_name"=>"Illinois"), Array("state_id"=> "22", "state_name"=>"Massachusetts"));
$new = calculate_intersection($a, $b);
print ((count($new) == count($a) && count($a) == count($b)) ? "." : "FAIL");
print (($new[0]['state_id'] == 14 ? "." : "FAIL"));
print (($new[0]['state_name'] == "Illinois" ? "." : "FAIL"));
print (($new[1]['state_id'] == 22 ? "." : "FAIL"));
print (($new[1]['state_name'] == "Massachusetts" ? "." : "FAIL"));
//==============================================
$a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"));
$b = Array(Array("state_id"=>"22", "state_name"=>"Massachusetts"));
$new = calculate_intersection($a, $b);
print "\nGroup5\n";
print ((count($new) == 0) ? "." : "FAIL");
//==============================================
$a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"));
$b = Array(Array("state_id"=>"14", "state_name"=>"Illinois"), Array("state_id"=>"22", "state_name"=>"Massachusetts"));
$new = calculate_intersection($a, $b);
print "\nGroup6\n";
print ((count($new) == 1) ? "." : "FAIL");
print (($new[0]['state_id'] == 14) ? "." : "FAIL");
print (($new[0]['state_name'] == "Illinois") ? "." : "FAIL");
//==============================================
$a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"));
$b = Array(Array("state_id"=>"22", "state_name"=>"Massachusetts"), Array("state_id"=>"14", "state_name"=>"Illinois"));
$new = calculate_intersection($a, $b);
print "\nGroup7\n";
print ((count($new) == 1) ? "." : "FAIL");
print (($new[0]['state_id'] == 14) ? "." : "FAIL");
print (($new[0]['state_name'] == "Illinois") ? "." : "FAIL");
//==============================================
$a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"));
$b = Array(Array("state_id"=>"22", "state_name"=>"Massachusetts"), Array("state_id"=>"14", "state_name"=>"Fromulate"));
$new = calculate_intersection($a, $b);
print "\nGroup8\n";
print ((count($new) == 0) ? "." : "FAIL");
//==============================================
$a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"), Array("state_id"=>"14", "state_name"=>"Illinois"));
$b = Array(Array("state_id"=>"14", "state_name"=>"Illinois"), Array("state_id"=>"14", "state_name"=>"Illinois"));
$new = calculate_intersection($a, $b);
print "\nGroup9\n";
print ((count($new) == 2) ? "." : "FAIL");
print (($new[0]['state_id'] == 14) ? "." : "FAIL");
print (($new[0]['state_name'] == "Illinois") ? "." : "FAIL");
print (($new[1]['state_id'] == 14) ? "." : "FAIL");
print (($new[1]['state_name'] == "Illinois") ? "." : "FAIL");
//==============================================
$a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"), Array("state_id"=>"22", "state_name"=>"Massachusetts"));
$b = Array(Array("state_id"=>"22", "state_name"=>"Massachusetts"), Array("state_id"=>"14", "state_name"=>"Illinois"));
$new = calculate_intersection($a, $b);
print "\nGroup7\n";
print ((count($new) == 2) ? "." : "FAIL");
print (($new[0]['state_id'] == 14) ? "." : "FAIL");
print (($new[0]['state_name'] == "Illinois") ? "." : "FAIL");
print (($new[1]['state_id'] == 22) ? "." : "FAIL");
print (($new[1]['state_name'] == "Massachusetts") ? "." : "FAIL");
?>
eric@dev $ php a.php
Group1
..
Group2
....
Group3
.....
Group5
.
Group6
...
Group7
...
Group8
.
Group9
.....
Group7
.....
所有的点意味着一切都过去了

此代码处理哪些情况?

  • 两个数组都为空。十字路口是空的
  • 一个为空,另一个为项目。十字路口是空的
  • 两个数组都有相同的项,set:1和set:n。交点相当于第一个数组
  • 两个数组都是相同的,只是混洗了。交集相当于第一个数组
  • 数组是相同的,只是state_名称在每种情况下不同,state_id相同。十字路口是空的
  • 数组a有b不常见的项,b共有的项。数组b有a不常见的项和a共有的项。交集是a和b共有的项 它不起作用的地方:

    <?php
        function compare_states($a1, $a2){
            $diff1 = strcasecmp($a1['state_id'], $a2['state_id']);
            $diff2 = strcasecmp($a1['state_name'], $a2['state_name']);
            if ($diff1 != 0) return $diff1;
            if ($diff2 != 0) return $diff2;
            return 0;
        }
        function calculate_intersection($a1, $a2){
            return array_uintersect($a1, $a2, 'compare_states');
        }
    ?>
    
    <?php
        $a = Array(Array("state_id"=>14, "state_name"=>"Illinois"));
        $b = Array(Array("state_id"=>14, "state_name"=>"Illinois"));
        $new = calculate_intersection($a, $b);
        print_r($a);
        //in this simple case, the intersection is equivalent to $a.
        $a = Array(Array("state_id"=>14, "state_name"=>"Illinois"));
        $b = Array(Array("state_id"=>14, "state_name"=>"Foobar"));
        $new = calculate_intersection($a, $b);
        print_r($a);
        //in this case, the intersection is empty.
    ?>
    
    $a = Array();
    $b = Array();
    $new = calculate_intersection($a, $b);
    print "\nGroup1\n";
    print ((count($new) == count($a) && count($a) == count($b)) ? "." : "FAIL");
    print ((count($new) == 0) ? "." : "FAIL");
    //==============================================
    $a = Array(Array("state_id"=>14, "state_name"=>"Illinois"));
    $b = Array(Array("state_id"=>14, "state_name"=>"Illinois"));
    $new = calculate_intersection($a, $b);
    print "\nGroup2\n";
    print ((count($new) == count($a) && count($a) == count($b)) ? "." : "FAIL");
    print ((count($new) == 1) ? "." : "FAIL");
    print (($new[0]['state_id'] == 14 ? "." : "FAIL"));
    print (($new[0]['state_name'] == "Illinois" ? "." : "FAIL"));
    //==============================================
    print "\nGroup3\n";
    $a = Array(Array("state_id"=>14, "state_name"=>"Illinois"), Array("state_id"=> "22", "state_name"=>"Massachusetts"));
    $b = Array(Array("state_id"=>14, "state_name"=>"Illinois"), Array("state_id"=> "22", "state_name"=>"Massachusetts"));
    $new = calculate_intersection($a, $b);
    print ((count($new) == count($a) && count($a) == count($b)) ? "." : "FAIL");
    print (($new[0]['state_id'] == 14 ? "." : "FAIL"));
    print (($new[0]['state_name'] == "Illinois" ? "." : "FAIL"));
    print (($new[1]['state_id'] == 22 ? "." : "FAIL"));
    print (($new[1]['state_name'] == "Massachusetts" ? "." : "FAIL"));
    //==============================================
    $a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"));
    $b = Array(Array("state_id"=>"22", "state_name"=>"Massachusetts"));
    $new = calculate_intersection($a, $b);
    print "\nGroup5\n";
    print ((count($new) == 0) ? "." : "FAIL");
    //==============================================
    $a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"));
    $b = Array(Array("state_id"=>"14", "state_name"=>"Illinois"), Array("state_id"=>"22", "state_name"=>"Massachusetts"));
    $new = calculate_intersection($a, $b);
    print "\nGroup6\n";
    print ((count($new) == 1) ? "." : "FAIL");
    print (($new[0]['state_id'] == 14) ? "." : "FAIL");
    print (($new[0]['state_name'] == "Illinois") ? "." : "FAIL");
    //==============================================
    $a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"));
    $b = Array(Array("state_id"=>"22", "state_name"=>"Massachusetts"), Array("state_id"=>"14", "state_name"=>"Illinois"));
    $new = calculate_intersection($a, $b);
    print "\nGroup7\n";
    print ((count($new) == 1) ? "." : "FAIL");
    print (($new[0]['state_id'] == 14) ? "." : "FAIL");
    print (($new[0]['state_name'] == "Illinois") ? "." : "FAIL");
    //==============================================
    $a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"));
    $b = Array(Array("state_id"=>"22", "state_name"=>"Massachusetts"), Array("state_id"=>"14", "state_name"=>"Fromulate"));
    $new = calculate_intersection($a, $b);
    print "\nGroup8\n";
    print ((count($new) == 0) ? "." : "FAIL");
    //==============================================
    $a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"), Array("state_id"=>"14", "state_name"=>"Illinois"));
    $b = Array(Array("state_id"=>"14", "state_name"=>"Illinois"), Array("state_id"=>"14", "state_name"=>"Illinois"));
    $new = calculate_intersection($a, $b);
    print "\nGroup9\n";
    print ((count($new) == 2) ? "." : "FAIL");
    print (($new[0]['state_id'] == 14) ? "." : "FAIL");
    print (($new[0]['state_name'] == "Illinois") ? "." : "FAIL");
    print (($new[1]['state_id'] == 14) ? "." : "FAIL");
    print (($new[1]['state_name'] == "Illinois") ? "." : "FAIL");
    //==============================================
    $a = Array(Array("state_id"=>"14", "state_name"=>"Illinois"), Array("state_id"=>"22", "state_name"=>"Massachusetts"));
    $b = Array(Array("state_id"=>"22", "state_name"=>"Massachusetts"), Array("state_id"=>"14", "state_name"=>"Illinois"));
    $new = calculate_intersection($a, $b);
    print "\nGroup7\n";
    print ((count($new) == 2) ? "." : "FAIL");
    print (($new[0]['state_id'] == 14) ? "." : "FAIL");
    print (($new[0]['state_name'] == "Illinois") ? "." : "FAIL");
    print (($new[1]['state_id'] == 22) ? "." : "FAIL");
    print (($new[1]['state_name'] == "Massachusetts") ? "." : "FAIL");
    ?>
    
    eric@dev $ php a.php
    Group1
    ..
    Group2
    ....
    Group3
    .....
    Group5
    .
    Group6
    ...
    Group7
    ...
    Group8
    .
    Group9
    .....
    Group7
    .....
    
    它不测试空/未定义/不同深度数组,也不测试深度为2层或2层以上的数组。如果数据类型被交换,将字符串与整数进行比较,或将浮点值与八进制值进行比较,则可能会失败。很难让PHP正确执行相等操作


    尽你所能在数据库中完成这项工作,用PHP来完成这项工作会给失败的鲸鱼敲响号角。这是低效的,所以你最好不要操作超过几百个项目。在意外情况下,它会让你大吃一惊,而且很难阅读/理解它在引擎盖下做了什么。

    array_intersect_key不做多维相交它在键上相交,值是数组并不重要。非常感谢@deceze,这正是我需要的。你太棒了。如果第一个是索引数组,第二个子数组是关联数组,怎么做?当值是这样的数组时,你需要检查第二个参数是否也是数组以防止类型错误(将非数组值发送回函数):'if(is_数组($value)和is_数组($array2[$key])){`Hi@deceze,如何添加$array2两者都与$array2匹配和不匹配