2017-05-05 5 views
-1

배열에서 unique urls을 식별해야합니다.URL을위한 PHP 배열

다음 변형 모두는 동일한 것으로 간주한다 :

http://google.com 
https://google.com 
http://www.google.com 
https://www.google.com 
www.google.com 
google.com 

I는 다음과 같은 용액을은 :

public static function array_unique_url(array $array) : array 
{ 
    $uniqueArray = []; 
    foreach($array as $item) { 
     if(!self::in_array_url($item, $uniqueArray)){ 
      $uniqueArray[] = $item; 
     } 
    } 
    return $uniqueArray; 
} 

public static function in_array_url(string $needle, array $haystack): bool { 
    $haystack = array_map([self::class, 'normalizeUrl'], $haystack); 
    $needle = self::normalizeUrl($needle); 

    return in_array($needle, $haystack); 
} 

public static function normalizeUrl(string $url) { 
    $url = strtolower($url); 
    return preg_replace('#^(https?://)?(www.)?#', '', $url); 
} 

그러나, 이것은 매우 효율적인 O (N^2) 아니다. 아무도 더 나은 해결책을 가르쳐 줄 수 있습니까?

+0

출력을 원하는 달성하기위한 두 가지 기능 preg_replaceparse_url을 사용하고 있습니까? –

+0

@SahilGulati 나는 꽤 분명하다고 생각합니다. 사람들은 그 질문을 이해합니다. – Chris

답변

1

in_array는 비쌉니다. 이를 수행하는 대신 해시를 만들고 값을 값으로 저장합니다. 뭔가 같은 :

$myHash = []; //a global array to hold values. 

그리고 확인하면서,이 작업을 수행합니다 :

if(!empty($myHash[$needle])){ 
    //already exits 
} 
0

나는 그것을 테스트하지 않은,하지만 어쩌면 이런 식으로 뭔가가 작동이 :

여기
function getUniqueUrls(array $urls) 
{ 
    $unique_urls = []; 
    foreach ($urls as $url) { 
     $normalized_url = preg_replace('#^(https?://)?(www.)?#', '', strtolower($url)); 
     $unique_urls[$normalized_url] = true; 
    } 

    return array_keys($unique_urls); 
} 

$arr = [ 
    'http://google.com', 
    'https://google.com', 
    'http://www.google.com', 
    'https://www.google.com', 
    'www.google.com', 
    'google.com' 
]; 

$unique_urls = getUniqueUrls($arr); 
0

가있다 단순화 된 버전. 그것은 많은 비용으로 preg_replace를 사용하지 않습니다. 또한 불필요한 문자열 연산을하지 않습니다. 이 분류되지 않는 '와 in_array'전체 배열을 검색하기 때문에

$urls = array(
    "http://google.com", 
    "https://google.com", 
    "http://www.google.com", 
    "https://www.google.com", 
    "www.google.com", 
    "google.com" 
); 

$uniqueUrls = array(); 

foreach($urls as $url) { 
    $subPos = 0; 
    if(($pos = stripos($url, "://")) !== false) { 
     $subPos = $pos + 3; 
    } 
    if(($pos = stripos($url, "www.", $subPos)) !== false) { 
     $subPos = $pos + 4; 
    } 
    $subStr = strtolower(substr($url, $subPos)); 
    if(!in_array($subStr, $uniqueUrls)) { 
     $uniqueUrls[] = $subStr; 
    } 
} 

var_dump($uniqueUrls); 

또 다른 성능 최적화는 고유 URL 이진 검색을 구현 ​​될 수있다.

0
<?php 

$urls = [ 
    'http://google.com', 
    'https://google.com', 
    'http://www.google.com', 
    'https://www.google.com', 
    'www.google.com', 
    'google.com', 
    'testing.com:9200' 
]; 

$uniqueUrls = []; 

foreach ($urls as $url) { 
    $urlData = parse_url($url); 
    $urlHostName = array_key_exists('host',$urlData) ? $urlData['host'] : $urlData['path']; 
    $host = str_replace('www.', '', $urlHostName); 
    if(!in_array($host, $uniqueUrls) && $host != ''){ 
     array_push($uniqueUrls, $host); 
    } 
} 
print_r($uniqueUrls); 

?> 
0

결과 배열을 매번 정규화하는 이유는 무엇입니까? 당신이 array_keys

0

이 시도하지 않아도 당신이 원래 항목을하려는 경우

public static function array_unique_url(array $array): array 
{ 
    $uniqueArray = []; 
    foreach ($array as $item) { 
     if (!isset($uniqueArray[$item])) { 
      $uniqueArray[$item] = self::normalizeUrl($item); 
     } 
    } 

    return $uniqueArray; 
} 

public static function normalizeUrl(string $url) 
{ 
    return preg_replace('#^(https?://)?(www.)?#', '', strtolower($url)); 
} 

당신이 당신의 정규화 된 URL에 array_keys(array_unique_url($array))

을 사용할 수 있습니다 : 여기

은 코드와 더 나은 솔루션입니다 가장 간단한 솔루션. 여기에서 우리는 당신이 당신의 질문을 한 번 설명 할 수

Try this code snippet here

<?php 

$urls = array(
    "http://google.com", 
    "https://google.com", 
    "http://www.google.com", 
    "https://www.google.com", 
    "www.google.com", 
    "google.com" 
); 

$uniqueUrls=array(); 
foreach($urls as $url) 
{ 
    $changedUrl= preg_replace("/^(https?:\/\/)?/", "http://", $url);//adding http to urls which does not contains. 
    $domain= preg_replace("/^(www\.)?/","",parse_url($changedUrl,PHP_URL_HOST));//getting the desired host and then removing its www. 
    preg_match("/^[a-zA-Z0-9]+/", $domain,$matches);//filtering on the basis of domains 
    $uniqueUrls[$matches[0]]=$domain; 
} 
print_r(array_values($uniqueUrls));