繁体   English   中英

PHP如何获取两个或多个数组的交集

[英]PHP How to get the intersection of two or more arrays

我正在尝试使用这种结构来获取两个或多个数组的交集:

第一个数组:

array(
    [0] => array(
        ['room_id'] => 21
        ['room_name'] => 'GB 101'
        ['capacity'] => 40
    )
    [1] => array(
        ['room_id'] => 22
        ['room_name'] => 'H 114'
        ['capacity'] => 20
    )
    [2] => array(
        ['room_id'] => 23
        ['room_name'] => 'GB 203'
        ['capacity'] => 20
    )
    [3] => array(
        ['room_id'] => 25
        ['room_name'] => 'H 100'
        ['capacity'] => 30
    )
    [4] => array(
        ['room_id'] => 26
        ['room_name'] => 'GB 206'
        ['capacity'] => 40
    )
)

第二个数组:

array(
    [0] => array(
        ['room_id'] => 21
        ['room_name'] => 'GB 101'
        ['capacity'] => 40
    )
    [1] => array(
        ['room_id'] => 23
        ['room_name'] => 'GB 203'
        ['capacity'] => 20
    )
    [2] => array(
        ['room_id'] => 26
        ['room_name'] => 'GB 206'
        ['capacity'] => 40
    )
)

结果数组:

array(
    [0] => array(
        ['room_id'] => 21
        ['room_name'] => 'GB 101'
        ['capacity'] => 40
    )
    [1] => array(
        ['room_id'] => 23
        ['room_name'] => 'GB 203'
        ['capacity'] => 20
    )
    [2] => array(
        ['room_id'] => 26
        ['room_name'] => 'GB 206'
        ['capacity'] => 40
    )
)

我尝试使用array_intersect_assoc使用以下代码获取交点:

$result = call_user_func_array('array_intersect_assoc', $arrays);

它可以解决问题,但是会给出以下警告,请按照此处进行操作

遇到PHP错误

严重程度:注意

消息:数组到字符串的转换

我正在制作一个基于Ajax的系统,因此错误将其弄乱了。 有什么办法可以得到数组的交集吗?

尝试序列化它们:

$result = array_map('unserialize',
              array_intersect(
                  array_map('serialize', $first), array_map('serialize', $second)));

使用array_uintersect()可以使用自定义比较功能,例如,按room_id进行比较。

<?php
$array1 = array(
    "0" => array(
        "room_id" => 21,
        "room_name" => 'GB 101',
        "capacity" => 40
    ),
    "1" => array(
        "room_id" => 22,
        "room_name" => 'H 114',
        "capacity" => 20
    ),
    "2" => array(
        "room_id" => 23,
        "room_name" => 'GB 203',
        "capacity" => 20
    ),
    "3" => array(
        "room_id" => 25,
        "room_name" => 'H 100',
        "capacity" => 30
    ),
    "4" => array(
        "room_id" => 26,
        "room_name" => 'GB 206',
        "capacity" => 40
    )
);

$array2 = array(
    "0" => array(
        "room_id" => 21,
        "room_name" => 'GB 101',
        "capacity" => 40
    ),
    "1" => array(
        "room_id" => 23,
        "room_name" => 'GB 203',
        "capacity" => 20
    ),
    "2" => array(
        "room_id" => 26,
        "room_name" => 'GB 206',
        "capacity" => 40
    )
);

$intersect = array_uintersect($array1, $array2, 'compareDeepValue');

function compareDeepValue($val1, $val2)
{
   return strcmp($val1['room_id'], $val2['room_id']);
}

echo "<pre>";
print_r($intersect);

?>

输出:

Array
(
    [0] => Array
        (
            [room_id] => 21
            [room_name] => GB 101
            [capacity] => 40
        )    
    [1] => Array
        (
            [room_id] => 23
            [room_name] => GB 203
            [capacity] => 20
        )    
    [2] => Array
        (
            [room_id] => 26
            [room_name] => GB 206
            [capacity] => 40
        )    
)

要比较两个多维数组,一个简单的解决方案是

$new_array = array();
foreach($array1 as $sub_array1)
{
   foreach($array2 as $sub_array2)
   {
       if($sub_array1 === $sub_array2)
       {
            $new_array[] = $sub_array2;
       }
   }
}

print_r($new_array);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM