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
相关产品推荐
相关产品推荐

