2017-05-05 15 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 

私は以下のソリューションを持っているが:

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

を達成するための2つの機能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は使用しません。また、不要な文字列操作も行いません。

$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); 

'in_array'はソートされていない配列全体を検索するため、別のパフォーマンス最適化では、一意の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

なぜ結果配列が毎回ノーマライズされるのですか?ここ

はあなたのコードとのより良いソリューションです:

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))

を使用することができ、あなたのオリジナルのアイテムが必要な場合は、あなたがarray_keys

0

これを試してみてくださいする必要はありません最も簡単なソリューションです。ここでは、あなたが一度あなたの質問を説明することができる所望の出力

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));