【问题标题】:Arrays difference and elements partially equal数组差异和元素部分相等
【发布时间】:2019-05-26 13:23:39
【问题描述】:

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

我已经达到了以下结果:

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)

【问题讨论】:

  • 您忘记了密码。另外,这个问题真的不清楚。
  • 谢谢。代码有问题。我已经简化了代码,目的是获得建议。我不能很好的解决方案。我尝试了 array_diff、preg_match 和其他一些,但我找不到正确的指令。
  • 您的数组差异是否必须对齐?如$aa[0]$bb[0] 等等?或者您想针对所有 $bb 元素检查 $aa 中的每个索引?
  • 您需要澄清为什么 3 4 5 9 10 和 15 不是正确解决方案的一部分

标签: php arrays


【解决方案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

【讨论】:

  • 注意 OP 不希望 3 4 5 作为其中的一部分 (1 2) 在 $bb
  • @dWinder 这毫无意义。 OP需要澄清
  • Tks。此示例不适用于我的目的。我的目标是比较数组 $aa 中的每个元素,如果部分相等则将其排除。例如$bb 中的 "1 2" 不包括 "1 2 3 4 5" 等等。考虑到我的例子,我会得到以下结果“21 22 23 24 25”。应排除数组 $aa 的所有其他元素。
  • 那么如果$bb的一个子项在$aa中匹配,那么$aa中的所有子项都被丢弃?
  • 抱歉我的回复晚了。我做了一些测试。上面提到的解决方案有效,但只是理论上的。确实,我的目标不同。如果 $bb 的一个子项匹配,则丢弃 $aa 中的一个子项是不够的。我会将 $aa 中数组的每个元素与 $bb 的两个、三个或四个数字组(不仅仅是一个)进行比较,如果部分与 $bb 匹配,则丢弃一个子项。也许我可以将 array_diff 与快乐的字符一起使用?
猜你喜欢
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
相关资源
最近更新 更多