2015-08-12 3 views
0

У меня есть массив, который выглядит следующим образом ...Сокращение строки URL, без дублей

$urls = array(
    "http://www.google.com", 
    "http://www.google.com/maps", 
    "http://www.google.com/mail", 
    "https://drive.google.com", 
    "https://www.youtube.com", 
    "https://www.youtube.com/feed/subscriptions", 
    "https://www.facebook.com/me", 
    "https://www.facebook.com/me/friends" 
); 

Я нахожу это трудно объяснить, но я хочу, чтобы разорвать этот массив вниз, чтобы показывать только сокращенные URL-адреса с не дубликаты, так это выглядит ...

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

Обратите внимание на последний URL во втором массиве до сих пор это путь. Это потому, что я хочу еще хочу показать самые низкие пути уровня

+0

ли вы имеете в виду, что вы хотите удалить все соответствующие домены? – Blake

+0

Вы должны хотя бы объяснить, почему вы никогда не включаете путь, за исключением последнего URL-адреса. (См. [Wikipedia on URL] (https://en.wikipedia.org/wiki/Uniform_resource_locator#Syntax) для чистого словаря. –

ответ

0

Попробуйте это:

$result = array(); 
array_push($result, $urls[0]) 
for($i=1; $i<count($urls); $i++) 
{ 
    $repeat = false; 
    foreach($result as $res) 
    { 
     if(strpos($urls[i], $res)) 
     { 
      $repeat = true; 
      break; 
     } 
    } 
    if(!repeat) 
     array_push($result, $urls[i]) 
} 

return $result; 
3

на основе @ ответ Тима

foreach ($urls as &$url) { 
    $url_parts = parse_url($url); 
    $url = $url_parts["scheme"]."://".$url_parts["host"]; 
} 

$urls = array_unique($urls); 
+0

Вы избили меня до правильного ответа :-) –

+0

@ davcs86 почти, я все еще хочу показать путь нижнего уровня – itsliamoco

+0

, если вы хотите показать маршрут самого низкого уровня, «http://www.google.com», «http://www.google.com/maps» и «http://www.google. com/mail "будет в уменьшенном массиве. это правильно? – davcs86

1

Просто сортирует массив в обратном порядке, и создать массив индексируется хоста:

$urls = array(
    "http://www.google.com", 
    "http://www.google.com/maps", 
    "http://www.google.com/mail", 
    "https://drive.google.com", 
    "https://www.youtube.com", 
    "https://www.youtube.com/feed/subscriptions", 
    "https://www.facebook.com/me", 
    "https://www.facebook.com/me/friends" 
); 

rsort($urls); 

$return = []; 
foreach($urls as $url) { 
     $host = parse_url($url, PHP_URL_HOST); 
     $return[$host] = $url; 
} 
$return = array_values($return); // To remove array keys, if desired. 

обратное упорядоченный массив ссылок будет:

Array 
(
    [0] => https://www.youtube.com/feed/subscriptions 
    [1] => https://www.youtube.com 
    [2] => https://www.facebook.com/me/friends 
    [3] => https://www.facebook.com/me 
    [4] => https://drive.google.com 
    [5] => http://www.google.com/maps 
    [6] => http://www.google.com/mail 
    [7] => http://www.google.com 
) 

Поскольку последняя запись (на имя хоста) в отсортированном массиве является тот, который вы хотите, и он намеренно задавливает любое существующее значение массива, это выведет:

Array 
(
    [www.youtube.com] => https://www.youtube.com 
    [www.facebook.com] => https://www.facebook.com/me 
    [drive.google.com] => https://drive.google.com 
    [www.google.com] => http://www.google.com 
)