Spalte aus mehrdimensionalem Array löschen klappt nicht ganz

dexX23b

Grünschnabel
Hi,

ich bin zur Zeit dabei ein kleines PHP-Programm zu schreiben, welches die Links innerhalb einer Seite auflistet. Konkreter möchte ich das auf wikipedia anwenden, um so verwandte Artikel aufzulisten. Dabei gibt es die Möglichkeit ein Anfangs- sowie Endkriterium zu setzen, sowie Ausnahmen.

Jetzt ist allerdings das Problem, dass die Daten nach dem Entfernen der Ausnahmen a) nicht mehr komplett ausgegeben werden oder vorhanden sind, außerdem werden Leerräume im Array erzeugt, trotz der Nutzung von array_values().

Ich vermute mal, ich habe einen kleinen Fehler in den Schleifen gemacht, bin ziemlich neu in dem Gebiet.. :/

PHP:
<?php
// Config
$offlink = "http://de.wikipedia.org";						// Link, der den Links vorangestellt wird
$str_start = "<!-- start content -->";						// Ab diesem String fängt die Suche an
$str_end = "Spezial:Kategorien";							// Ab diesem String hört die Suche auf

$url_exceptions = array("#");
$title_exceptions = array("Bearbeiten", "Verbergen", "img");

// HTML Datei einlesen
$url = $_GET['url'];
$contents = file_get_contents($url);

// Anfang und Ende abschneiden
$contents = substr($contents, strpos($contents, $str_start));
$contents = substr($contents, 0, strpos($contents, $str_end));

// Links aus der Variable holen
preg_match_all("!<a.*?href=\"([^\"]*)\"[^>]*>(.*?)</a>!", $contents, $result);

// Ausnahmen entfernen
foreach ($url_exceptions as $url_exc)
{
	for ($j = 0; $j < count($result[1]); $j++)
	{
		if (strpos($result[1][$j], $url_exc) > -1)
		{
			echo "<br>GELÖSCHT: ".$result[0][$j];
			foreach ($result as $k => $v)
			{
				if (isset($result[$k][$j]))
				{
			        unset($result[$k][$j]);
			    }
			}
		}
	}

}
foreach ($title_exceptions as $title_exc)
{
	for ($j = 0; $j < count($result[2]); $j++)
	{
		if (strpos($result[2][$j], $title_exc) > -1)
		{
			echo "<br>GELÖSCHT: ".$result[0][$j];
			foreach ($result as $k => $v)
			{
				if (isset($result[$k][$j]))
				{
			        unset($result[$k][$j]);
			    }
			}
		}
	}

}
$result = array_values($result);

// Ausgabe
echo "Anzahl gefundener Links: ".count($result[0])."<br><br>";
for ($i = 0; $i < count($result[0]); $i++)
{
	echo "<a href='".$offlink.$result[1][$i]."'>".$result[2][$i]."</a><br>";
} 
?>
 
Zuletzt bearbeitet:
Mit Splice entfenrnst du den Eintrag. Mit Unset wird er nur auf NULL gesetzt und array_values() akzeptiert auch NULL als Eintrag

Aber du solltest die Array-Vergleichsfunktionen von PHP ausnützen. Ich habe hier mal ein kleines Testscript erstellt.

PHP:
<?php
    /** testdaten */
    $results[0] = array(11,22,33,44,55);
    $results[1] = array(1,2,3,4,5);
    $results[2] = array(10,20,30,40,50);
    $url_exceptions = array(2, 5);
    $title_exceptions = array(20 ,30);

    /**
     * filter
     * @param $results  
     * @param $type         // key des zu prüfenden Typs.
     * @param $url_exceptions  //Exceptionliste
     */
    function filter(&$results, $type, $exceptions){
        // Alle Einträge finden, die gefiltert werden müssen
        $novalids = array_intersect($results[$type], $exceptions);
        
        // für alle Unterarrays filtern
        foreach ($results as $key => $value){
            // alle Einträge übernehmen, deren Key kein Key des Exceptionarrays ist.    
            $results[$key] = array_diff_key($results[$key], $novalids);
        }
    }

    /** filter the url */
    filter($results, 1, $url_exceptions);
    /** filter the thitle */
    filter($results, 2, $title_exceptions);
    
    
    print_r($results);
?>
 
Hi,
vielen Dank erst mal! Ich werde mir die Funktionen array_intersect und array_diff_key noch mal genauer anschauen und die Lösung anpassen, denn in meinem Fall langt es leider nicht, weil noch eine zusätzliche Suche innerhalb des Arrayelementes gestartet werden soll (z.B. nimmt title -> "img" auch title -> "<img src="test.jpg" alt="Test"> heraus).
 
Zurück