Array_insersect只有在数组内部字符串完全匹配时才会显示结果。但是我需要的是相似的记录,而不是精确的记录。
$array1 = array("http://example.com/abc","http://google.com/xyz","http://yahoo.com/abc", "http://stackoverflow.com/mnr");
$array2 = array("http://example.com/xyz","http://w3schools.com/xyz","http://stackoverflow.com/abc");
$similarRecords = array_intersect($array1, $array2);
它将给出一个空值。
我在寻找这样的
$similarRecords = array("example.com");
我怎么能得到这个。
试试这个:
function domain($n){
$url = parse_url($n);
return $url['host'];
}
$array1 = array("http://example.com/abc","http://google.com/xyz","http://yahoo.com/abc", "http://stackoverflow.com/mnr");
$array2 = array("http://example.com/xyz","http://w3schools.com/xyz","http://stackoverflow.com/abc");
$similarRecords = array_intersect(array_map("domain", $array1), array_map("domain", $array2));
echo "<pre>";
print_r($similarRecords);
输出:Array
(
[0] => example.com
[3] => stackoverflow.com
)
没有查找"相似"记录的内置方法(主要是因为"相似"有许多定义!)。不过,您也可以手动完成,方法是遍历其中一个数组,并查找另一个数组中是否有类似的元素。
function keepSimilars (array $first, array $second) {
$result = array();
foreach ($first as $elem) {
$base = getBase($elem);
$found = false;
foreach ($second as $elem2)
if ($base = getBase($elem2)) {
$found = true;
break;
}
if ($found) $result[] = $base;
}
return $result;
}
当然,getBase()
是一个函数(你必须定义),它给你字符串的基本部分,你想要匹配的部分(getBase('http://example.com/abc')
应该给你example.com
)。你也可以使用回调
你在找这个吗?
$array1 = array("http://example.com/abc", "http://google.com/xyz", "http://yahoo.com/abc", "http://stackoverflow.com/mnr");
$array2 = array("http://example.com/xyz", "http://w3schools.com/xyz", "http://stackoverflow.com/abc");
$newArray1 = array();
foreach ($array1 as $array1data) {
$parse1 = parse_url($array1data);
$newArray1[] = $parse1['host'];
}
$newArray2 = array();
foreach ($array2 as $array2data) {
$parse2 = parse_url($array2data);
$newArray2[] = $parse2['host'];
}
$similarRecords = array_intersect($newArray1, $newArray2);
print_r($similarRecords);
输出Array ( [0] => example.com [3] => stackoverflow.com )
您需要做一些字符串处理,只从每个字符串中取出域名并进行比较。
如此:
$array1 = array("http://example.com/abc","http://google.com/xyz","http://yahoo.com/abc", "http://stackoverflow.com/mnr");
$array2 = array("http://example.com/xyz","http://w3schools.com/xyz","http://stackoverflow.com/abc");
$similarRecords = array_intersect(array_map("parseURLs", $array1), array_map("parseURLs", $array2));
print_r($similarRecords);
function parseURLs($strURL) {
$parts = parse_url($strURL);
return $parts['host'];
}
输出为:
Array ( [0] => example.com [3] => stackoverflow.com )
您可以使用similar_text进行比较。唯一的问题是可比性因素似乎是任意的。
<?php
$array1 = array("http://example.com/abc","http://google.com/xyz","http://yahoo.com/abc", "http://stackoverflow.com/mnr");
$array2 = array("http://example.com/xyz","http://w3schools.com/xyz","http://stackoverflow.com/abc");
print_r($array1);
print_r($array2);
echo "'n";
foreach ($array1 as $slice)
{
foreach ($array2 as $slice2)
{
echo 'Comparing '.$slice.' to '.$slice2.' gives comparability of '.similar_text($slice,$slice2)."'n";
if (similar_text($slice,$slice2) > 18)
{
echo $slice.' ____is similar to___ '.$slice2."'n";
}
}
}
?>
输出:Comparing http://example.com/abc to http://example.com/xyz gives comparability of 19
http://example.com/abc ____is similar to___ http://example.com/xyz
Comparing http://example.com/abc to http://w3schools.com/xyz gives comparability of 13
Comparing http://example.com/abc to http://stackoverflow.com/abc gives comparability of 17
Comparing http://google.com/xyz to http://example.com/xyz gives comparability of 17
Comparing http://google.com/xyz to http://w3schools.com/xyz gives comparability of 18
Comparing http://google.com/xyz to http://stackoverflow.com/abc gives comparability of 14
Comparing http://yahoo.com/abc to http://example.com/xyz gives comparability of 13
Comparing http://yahoo.com/abc to http://w3schools.com/xyz gives comparability of 15
Comparing http://yahoo.com/abc to http://stackoverflow.com/abc gives comparability of 18
Comparing http://stackoverflow.com/mnr to http://example.com/xyz gives comparability of 14
Comparing http://stackoverflow.com/mnr to http://w3schools.com/xyz gives comparability of 16
Comparing http://stackoverflow.com/mnr to http://stackoverflow.com/abc gives comparability of 25
http://stackoverflow.com/mnr ____is similar to___ http://stackoverflow.com/abc
,那么你将把匹配项放在一个数组中,然后输出。
您可以使用array_search()或array_uintersect()循环遍历一个数组并对另一个数组或uintersect进行松散搜索,并回调strpos
多亏了这一切,我终于做到了。
<?php
$array1 = array("http://example.com/abc","http://google.com/xyz","http://yahoo.com/abc", "http://stackoverflow.com/mnr");
$array2 = array("http://example.com/xyz","http://w3schools.com/xyz","http://stackoverflow.com/abc");
echo "<pre>";
print_r($array1);
echo "<br/>";
print_r($array2);
echo "<br/>";
$similarRecords = similarRecords($array1, $array2);
print_r($similarRecords);
echo "</pre>";
function getDomain($strURL)
{
$url = parse_url($strURL);
return $url['host'];
}
function similarRecords($array1, $array2)
{
$similarRecords = array();
foreach ($array1 as $slice)
{
foreach ($array2 as $slice2)
{
if (getDomain($slice) == getDomain($slice2))
{
$similarRecords[] = $slice;
$similarRecords[] = $slice2;
}
}
}
return $similarRecords;
}
?>