数组差异和元素部分相等

时间:2019-05-26 13:23:40

标签: php arrays

我想比较两个数组,不包括部分相等的元素。

我达到了以下结果:

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
21 22 23 24 25

所需的结果是:

21 22 23 24 25

尝试:

$aa = array("1 2 3 4 5", "6 7 8 9 10", "11 12 13 14 15", "16 17 18 19 20", "21 22 23 24 25");
$bb = array("1 2", "6 7 8", "11 12 13 14", "16 17 18 19 20");
$final = array_diff($aa, $bb);
print_r($final)

2 个答案:

答案 0 :(得分:1)

您可以使用preg_grep以便不必对数据进行任何操作。
这将使正则表达式查看匹配的内容,然后您只需使用array_diff。

$aa = array("1 2 3 4 5", "6 7 8 9 10", "11 12 13 14 15", "16 17 18 19 20", "21 22 23 24 25");
$bb = array("1 2", "6 7 8", "11 12 13 14", "16 17 18 19 20");

$exclude = [];
foreach($bb as $b){
    $exclude = array_merge($exclude, preg_grep("/^". preg_quote($b) . "/", $aa));
}
$final = array_diff($aa, $exclude);

print_r($final);

https://3v4l.org/XI9Jd

答案 1 :(得分:1)

首先使用array-map将字符串分解为数组:(不要忘记对$bb做同样的操作)

$aa = array_map(function ($e) {return explode(" ", $e);}, $aa); 

然后使用array-merge合并所有$bb元素,因为其中甚至有一个从A取消了数组:

$exlude = array_merge(...$bb);

然后使用array-intersect检查交集以查看结果数组是否包含排除元素之一:

foreach($aa as $e) {
    if (!array_intersect($e, $exlude)) $filterd[] = $e;
}

完整示例可见HERE