使用 array_diff 进行广泛匹配?

Using array_diff for broad matches?

我想做的是从一个数组中取出项目,例如:

$array1 = array(
"google-com",
"youtube-com",
);

如果包含上述项目(但广泛匹配,不完全匹配),则从第二个数组中删除项目。

$array2 = array(
"www-google-com",
"www-youtube-com",
"www-facebook-com",
"www-twitter-com",
);

预期输出:

 www-facebook-com
 www-twitter-com

注意:第一个数组包含 "example.com" 样式的网址,第二个数组包含“https://www.example.com/”样式的网址。

似乎 array_diff 只适用于完全匹配,经过大量搜索,我似乎无法找到使其适用于广泛匹配的方法。

感谢您的帮助!

希望这能解决您对问题的回答:)

$array1 = array(
"google-com",
"youtube-com",
);
$array1 = preg_filter('/^/', 'www-', $array1);

$array2 = array(
"www-google-com",
"www-youtube-com",
"www-facebook-com",
"www-twitter-com",
);


print_r(array_diff($array2, $array1));

你说得对,array_diff 不是这里的解决方案。解决方案之一是使用 preg_grep 查找记录,然后在 $array2:

中取消设置键
$array1 = array(
    "google-com",
    "youtube-com",
);

$array2 = array(
    "www-google-com",
    "www-youtube-com",
    "www-facebook-com",
    "www-twitter-com",
);

foreach ($array1 as $search) {
    foreach (preg_grep('/' . $search . '/', $array2) as $index => $value) {
        unset($array2[$index]);
    }
}

print_r($array2);

执行此操作的最简单方法是遍历每个数组,使用诸如 strpos 之类的函数来查看短 URL 是否包含在较长的 URL 中:

$output = array();
foreach ($array2 as $url) {
    $found = false;
    foreach ($array1 as $short_url) {
        $found = $found || (strpos($url, $short_url) !== false);
    }
    if (!$found) {
        $output[] = $url;
    }
}
print_r($output);

输出:

Array
(
    [0] => www-facebook-com
    [1] => www-twitter-com
)

虽然不知道 BROAD 匹配的确切含义,但 strpos 可能很接近。您始终可以编写自定义函数来进行匹配,并用它替换上面代码中的 strpos

进行迭代搜索时,始终提供提前退出。

具有早期 break 条件的嵌套循环性能最高。

代码:(Demo)

$array1 = array(
"google-com",
"youtube-com",
);

$array2 = array(
"www-google-com",
"www-youtube-com",
"www-facebook-com",
"www-twitter-com",
);

foreach ($array2 as $index => $haystack) {
    foreach ($array1 as $needle) {
        if (strpos($haystack, $needle) !== false) {
            unset($array2[$index]);
            break;
        }
    }
}
var_export(array_values($array2));

就是说,如果您的数据在某种程度上是可以预测的,并且您可以只准备一个数组,那么您可以省去大部分重复工作。