使用 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));
就是说,如果您的数据在某种程度上是可以预测的,并且您可以只准备一个数组,那么您可以省去大部分重复工作。
我想做的是从一个数组中取出项目,例如:
$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));
就是说,如果您的数据在某种程度上是可以预测的,并且您可以只准备一个数组,那么您可以省去大部分重复工作。