URLs gleicher Domain gruppieren ?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
absatz
array
artikel
ausgabe
ausgeben
beispiel
blocken
code
domain
einzigen domain
file
gleichen domain
host
http
info
list
liste
mache
match
stehen
-
Hallo
ich habe eine Liste mit URLs zu Artikeln,
wobei manche Artikel auf der gleichen Domain stehen,
aber die URLs sind nicht sortiert gespeichert.
Wie kann ich die URLs (Links) sortieren / ausgeben,
dass alle, welche zur "gleichen" (... zur "selben" ??? ) Domain gehören,
auch zusammen in einem Block (gruppiert) stehen ?!
Liste iet eine einfache .txt Datei mit je Zeile eine URL
http://beispiel.de/artikel/1234.htm http://example.org/news/abc/ http://irgendwas.tld/content/article/ http://beispiel.de/artikel/345.htm http://example.org/info/lalala/ .. usw
Ausgabe mache ich bisher so: (vereinfacht, ohne <a href ....> nur Liste)
print "<ul>\n"; $urldata = file('myfile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); foreach($urldata as $item) { print "<li>".$item."</li>\n"; } print "</ul>\n";
aber wie URLs die zur "gleichen" Domain gehören
in einem Absatz (ul-Liste) zusammen ausgeben ?!
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Vielleicht hilft dir das weiter:
<ul> = unordered list => liefert unsortierte Liste
<ol> = ordered list => liefert sortierte Liste -
Nein,
das ist ja nur die Ausgabe ob Liste mit odeer ohne Nummerierung ... FAIL !!!
ich suche einen Weg, wie ich die Liste wie z.B.
http://beispiel.de/artikel/1234.htm http://example.org/news/abc/ http://irgendwas.tld/content/article/ http://beispiel.de/artikel/345.htm http://example.org/info/lalala/ ...
so als "nach Domain gruppierte" Ausgabe bekomme
<ul> <li>http://beispiel.de/artikel/1234.htm</li> <li>http://beispiel.de/artikel/345.htm</li> </ul> <ul> <li>http://irgendwas.tld/content/article/</li> </ul> <ul> <li>http://example.org/news/abc/</li> <li>http://example.org/info/lalala/</li> </ul>
also alle URLs von der Domain beispiel.de in einem Block,
und alle URLs von der Domain irgendwas.tld in einem Block, etc. usw.
so dass es nicht so "durcheinander" ist, sondern nach Domain gruppiert
Beitrag zuletzt geändert: 22.4.2013 14:56:11 von giros -
Meinst du in etwa sowas:
<?php header('content-type: text/plain'); $domainlist = array( 'http://beispiel.de/artikel/1234.htm', 'http://example.org/news/abc/', 'http://irgendwas.tld/content/article/', 'http://beispiel.de/artikel/345.htm', 'http://example.org/info/lalala/' ); $ordered = array(); foreach($domainlist as $domain) { if(preg_match('|^https?://([^/]+?).*$|', $domain, $match)) { $name = $match[1]; if(!isset($ordered[$name])) $ordered[$name] = array(); $ordered[$name][] = $domain; } } ksort($ordered); foreach($ordered as $group) { echo("<ul>\n"); sort($group); foreach($group as $domain) { $domain = htmlspecialchars($domain); echo("\t<li>$domain</li>\n"); } echo("</ul>\n\n"); }
-
etwas kürzer:
$urldata = file('myfile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); asort($urldata); foreach($urldata as $item) { $host = parse_url($item)["host"]; echo (isset($temp)&&$temp==$host?"":"".(isset($temp)?"</ul>\n":"")."<ul>\n"); echo "<li>".$item."</li>\n"; $temp = parse_url($item)["host"]; } echo "</ul>\n";
-
jo, Danke
hab jetzt ne Kombination aus beiden Vorschlägen gebaut
$urldata = file('myfile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $resdata = array(); foreach($urldata as $item) { $ihost = parse_url($item, PHP_URL_HOST); if (!isset($resdata[$ihost])) { $resdata[$ihost] = array(); } if (!in_array($item,$resdata[$ihost])) { $resdata[$ihost][] = $item; } }
damit habe ich dann ein zwei-dimensionales Array
und kann je Domain (Host) einen Block ausgeben
foreach($resdata as $hosts) { print "<ul>\n"; // ---- start block foreach($hosts as $iurl) { $iname = preg_replace('|https?://|', '', $iurl); $ilink = '<a href="'.$iurl.'" target="_blank">'.$iurl.'</a>'; print " <li>".$ilink."</li>\n"; } print "</ul>\n"; // ---- ende block print "<br /> \n"; // ---- Abstand zwischen block }
ok, das funktioniert
aber ich habe auch viele URLs die nur von einer einzigen Domain sind,
die bekommen jetzt auch alle jeder seinen eigenen Block ...
... evtl. noch so machen, dass alle diese URLs, deren Host (Domain) nur 1x vorkommt
zusammen in einen Block kommen, also nur neuer Block wenn mind. 2 URLs von Domain
-
Hallo
Du kannst vor der Ausgabe foreach noch eine foreach-Schleife machen
foreach($url_data as $hkey => $hosts) { if (count($hosts) == 1) { $url_data['mixed'][] = $hosts[0]; unset($url_data[$hkey]); } }
dann sind alle URLs die nur zu einer einzigen Domain gehören
nicht mehr als eigene Sub-Arrays vorhanden sondern im Sub-Array $url_data['mixed'] abgelegt .
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage