php 多个多维数组求交集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 多个多维数组求交集相关的知识,希望对你有一定的参考价值。

参考技术A array_intersect
(php 4 >= 4.0.1, PHP 5)

array_intersect -- 计算数组的交集说明
array array_intersect ( array array1, array array2 [, array ...])

array_intersect() 返回一个数组,该数组包含了所有在 array1 中也同时出现在所有其它参数数组中的值。注意键名保留不变。

例子 1. array_intersect() 例子

<?php
$array1 = array ("a" => "green", "red", "blue");
$array2 = array ("b" => "green", "yellow", "red");
$result = array_intersect ($array1, $array2);
?>
这使得 $result 成为:

Array
(
[a] => green
[0] => red
)

注: 两个单元仅在 (string) $elem1 === (string) $elem2 时被认为是相同的。也就是说,当字符串的表达是一样的时候。

array_diff
(PHP 4 >= 4.0.1, PHP 5)

array_diff -- 计算数组的差集说明
array array_diff ( array array1, array array2 [, array ...])

array_diff() 返回一个数组,该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。注意键名保留不变。

例子 1. array_diff() 例子

<?php
$array1 = array ("a" => "green", "red", "blue", "red");
$array2 = array ("b" => "green", "yellow", "red");
$result = array_diff ($array1, $array2);
?>
这使得 $result 成为 array (1 => "blue");。在 $array1 中多次出现的值同样对待。

注: 两个单元仅在 (string) $elem1 === (string) $elem2 时被认为是相同的。也就是说,当字符串的表达是一样的时候。
注: 注意此函数仅检查多维数组中的一维。当然你可以用 array_diff($array1[0], $array2[0]); 检查更深的维度。

array_diff_assoc -- 带索引检查计算数组的差集

说明
array array_diff_assoc ( array array1, array array2 [, array ...])

array_diff_assoc() 返回一个 array,返回一个数组,该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。注意和 array_diff() 不同的是键名也用于比较。

例子 1. array_diff_assoc() 例子

<?php
$array1 = array ("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array ("a" => "green", "yellow", "red");
$result = array_diff_assoc($array1, $array2);

?>
上面的例子中可以看到键值对 "a" => "green" 在两个数组中都有,因此不在本函数的输出中。与此不同,键值对 0 => "red" 出现在输出中是因为第二个参数中的 "red" 的键名是 1。

键值对 key => value 中的两个值仅在 (string) $elem1 === (string) $elem2 时被认为相等。也就是说使用了严格检查,字符串的表达必须相同。本回答被提问者和网友采纳

多维关联数组交集php

【中文标题】多维关联数组交集php【英文标题】:Multidimensional associative array intersection php 【发布时间】:2012-08-29 06:12:04 【问题描述】:

我有两个多维数组

$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

【问题讨论】:

array_intersect_key 不做多维相交 它在上相交,值是数组没关系。 【参考方案1】:
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;

演示here.

【讨论】:

非常感谢@deceze,这正是我所需要的。你太棒了。 第一个是索引数组,第二个子数组是关联数组怎么办? 当值是这样的数组时,您还需要检查第二个参数是否为数组以防止类型错误(将非数组值发送回函数):'if (is_array ($value) && is_array($array2[$key])) ´ 嗨@deceze,如何添加 $array2 两者都匹配和不匹配到 $array2【参考方案2】:
$output = array_intersect_key($array1, $array2);

【讨论】:

【参考方案3】:

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
.....

所有的点表示一切都通过了。

这段代码处理什么情况?

    两个数组都是空的。交叉口是空的。 一个是空的,另一个是物品。交叉口是空的。 两个数组具有相同的项,设置:1 和设置:n。交集相当于第一个数组。 这两个数组是相同的,除了改组。交集相当于第一个数组。 除了 state_name 在每种情况下不同,并且 state_id 相同之外,这些数组都是相同的。路口是空的。 数组 a 有 b 不常见的项目,b 共有的项目。数组 b 有 a 不常见的项目和 A 共有的项目。交集是 a 和 b 共有的项目。

不能做什么:

它不会测试空值/未定义/不同深度数组,也不会测试 2 层或更多层深的数组。如果数据类型被交换,将字符串与整数进行比较,或者将浮点数与八进制进行比较,它可能会失败。很难让 PHP 正确地做相等。 http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/

尽你所能尝试在数据库中完成这项工作,在 PHP 中完成这项工作会吹响号角来召唤失败的鲸鱼。它效率低下,因此您最好不要对超过几百个项目进行操作。在意想不到的情况下,左戳你会让你感到惊讶,而且很难阅读/理解它在幕后所做的事情。

【讨论】:

【参考方案4】:

我认为你应该检查 $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确定多维数组中数组之间的交集

多维关联数组交集php

在 PHP 中执行数组交集时如何保留多维数组信息?

在PHP中获取多维数组的交集

求数组差/交集函数-php数组函数

求JS如何读取PHP里的多维数组?