You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP多维数组比较:如何获取两个数组的共同子数组

找出两个PHP多维数组的交集子数组

你要解决的是两个多维数组中完全匹配的子数组交集问题对吧?PHP自带的array_intersect()没法直接处理多维数组——因为它会把每个子数组转换成"Array"字符串来比较,根本没法准确判断子数组的内容是否一致。下面给你两种实用的解决思路:

方法一:序列化转换法

核心思路是把每个子数组转换成唯一的字符串标识,用原生的交集函数处理后再转回来,简单高效:

// 你的原始数组
$array1 = [
    ['prid' => 110, 'size_id' => 24],
    ['prid' => 117, 'size_id' => 24],
    ['prid' => 174, 'size_id' => 24]
];

$array2 = [
    ['prid' => 174, 'size_id' => 24],
    ['prid' => 174, 'size_id' => 25],
    ['prid' => 163, 'size_id' => 24]
];

// 把每个子数组序列化为字符串
$serializedArr1 = array_map('serialize', $array1);
$serializedArr2 = array_map('serialize', $array2);

// 求字符串数组的交集
$intersectedStrs = array_intersect($serializedArr1, $serializedArr2);

// 反序列化回多维数组
$intersection = array_map('unserialize', $intersectedStrs);

// 输出结果
print_r($intersection);

注意点:如果你的子数组键的顺序可能不一致(比如一个是['prid'=>174, 'size_id'=>24],另一个是['size_id'=>24, 'prid'=>174]),序列化后的字符串会不一样,这时候需要先给每个子数组的键排序,再序列化:

// 新增一个排序回调
$sortSubArr = function($subArr) {
    ksort($subArr);
    return $subArr;
};

// 先排序子数组,再序列化
$serializedArr1 = array_map(function($item) use ($sortSubArr) {
    return serialize($sortSubArr($item));
}, $array1);

$serializedArr2 = array_map(function($item) use ($sortSubArr) {
    return serialize($sortSubArr($item));
}, $array2);

方法二:直接遍历比较法

如果不想用序列化,也可以直接遍历数组,用严格比较来判断子数组是否存在:

$array1 = [...]; // 你的原始数组
$array2 = [...];

// 过滤出array1中同时存在于array2的子数组
$intersection = array_filter($array1, function($subArr) use ($array2) {
    // 第三个参数设为true,开启严格比较(值和类型都要匹配)
    return in_array($subArr, $array2, true);
});

// 可选:重置数组索引(array_filter会保留原数组的索引)
$intersection = array_values($intersection);

print_r($intersection);

同样,如果子数组键顺序可能不一致,就在回调里给子数组排序后再比较:

$intersection = array_filter($array1, function($subArr) use ($array2) {
    ksort($subArr);
    foreach ($array2 as $item) {
        $tempItem = $item;
        ksort($tempItem);
        if ($subArr === $tempItem) {
            return true;
        }
    }
    return false;
});

两种方法最终都会输出你要的交集结果:

Array
(
    [0] => Array
        (
            [prid] => 174
            [size_id] => 24
        )

)

内容的提问来源于stack exchange,提问作者Kames P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:21:02