2 arrays aus verschieden tables vergleichen und string geändert ausgeben

kurtparis

Erfahrenes Mitglied
Hallo zusammen !
Habe folgendes Problem
Ich möchte in einem Text string den ich aus einem table meiner mysql Datenbank hole einzelne Orte für die es Landkarten gibt und die ich in einem anderen table gespeichert habe die Namen der Orte im string durch eine URL ersetzen.

Was ich bis jetzt geschafft habe :
PHP:
$result = 'SELECT * FROM hp_regionen WHERE id = "5"'; 

$req = mysql_query($result) or die('Erreur SQL !<br>'.$result.'<br>'.mysql_error()); 


while($data = mysql_fetch_assoc($req)) 
    { 
   
    $erg=$data['villages']; 
   $tableau = explode(", ", $erg);
 
//  Ich öffne das table "hp_regionen"  mit dem Text-string, zerteile den String mittels "explode"  und speichere die 
// Ortsnamen einzeln in einem Array  "$tableau"
    } 

//2.
$selection = "SELECT id, nom FROM hp_maps_ville"; 
    $erg = mysql_query($selection); 
    while($row = mysql_fetch_assoc($erg)) { 
        $werte[$row['id']] = ($row['nom']); 
    } 

// Ich öffne das table "hp_maps_ville"  und speichere alle Ortsnamen und die dazugehörigen "id" die als
 // Variable für den Link dienen in einer zweidimensionalen Array "$werte"

// 3.
$intersect = array_intersect($werte, $tableau);
$diff = array_diff($tableau, $werte)

// Ich vergleiche beide Arrays mittels "array_intersect" und "array_diff"
//4.
while(list($key, $val) = each($intersect)) {	  
  echo "<a href='landkarten/urlaubsorte.php?id=".$key . "' rel='shadowbox;width=800px;player=iframe' title='Landkarte von Frankreich mit dem Urlaubsort  ".$val . "'> " . $val . "</a> , ";
};
while(list($key, $val) = each($diff)) {	  
  echo   $val . ", ";
}

// Ich gebe für die Ortsnamen die eine URL besitzen mittels while schleife  die Ortsnamen als URL aus
// und die Ortsnamen die keine URL besitzen mittels while schleife den Namen als Text aus

Bis dahin funktioniert alles !
Nun wäre es natürlich eleganter wenn der ursprünglich String $data['villages'] genauso wieder ausgegeben würde wie im Original und nicht zuerst die Ortsnamen mit Link und dann die Ortsnamen ohne Link !


Zur Verdeutlichung wenn der Original Text-string z.B.
Paris, Marseille, Nizza, Bordeaux, Cannes ist
und es nur einen Eintrag für Nizza und Cannes im table "hp_maps_ville" gibt
habe als Ergebniss :
Nizza, Cannes, Paris, Marseille, Bordeaux,
besser wäre
Paris, Marseille, Nizza, Bordeaux, Cannes

Das ganze müsste sich eigentlich mittels "str_replace" lösen lassen.
Da ich allerdings nicht besonders bewandert in PHP bin finde ich keine Lösung !
Hat jemand eine Idee ?
Danke im Voraus


Keiner eine Idee
Habe inzwischen stundenlang Versuche gemacht.
Mit "str_replace" findet mein Script (unten) zwar die richtigen Teile im String die ersetzt werden müssen. Das Problem ist nur wie komme ich zu einer Array "$Replace" die aus HTML-Tags und array_keys($intersect) + und HTML-Tags + array_values($intersect) besteht ?
PHP:
$toReplace=array_values($intersect);
$Replace= // hier ist das Problem ;

$Satz=$row['villages'];
$Ergebniss = str_replace($toReplace, $Replace , $Satz);

echo $Ergebniss;
Jemand eine Idee ?
 
Zuletzt bearbeitet:
Falls es jemanden interessiert, habe das Problem inzwischen selbst gelöst und zwar so :
PHP:
$toReplace=array_values($intersect);
foreach ($intersect as $key => $val) {
   $Replace[] = "<a href='landkarten/urlaubsorte.php?id=$key' rel='shadowbox;width=800px;player=iframe' title='Landkarte von Frankreich mit dem Urlaubsort  $val ' >$val</a>\n";
}
$Satz=$row['villages'];
$Ergebniss = str_replace($toReplace, $Replace , $Satz);
echo $Ergebniss;
 
Falls du es ganz in SQL lösen willst.....
SQL:
SELECT
	id,
	villages,
	link
FROM
	(
		SELECT 
			IF(@last_c <> id, true, false) AS visible,
			@last_c := id,
			ordered_1.*
		FROM 
			(SELECT @last_c :=0) AS vars,
			(
				SELECT
					id,	
					villages,
					@rnum:= IF(@last_id = id, @rnum+1, 1) AS rnum,
					IF(@last_id <> id, @link:=villages, ''),
					--Hier der Replace durchführen
					@Link := REPLACE(@Link, nom, CONCAT('<', city_id, ': ', nom, '>')) AS link,
					@last_id := id
				FROM
					(SELECT @last_id :=0) AS vars,
					(
						SELECT
							hp_regionen.id AS id,
							hp_regionen.villages AS villages,
							hp_maps_ville.id AS city_id,
							hp_maps_ville.nom AS nom
						FROM
							--Simuilation der Tablle hp_regionen
							(SELECT 1 AS id, 'Paris, Marseille, Nizza, Bordeaux, Cannes' AS villages
							UNION SELECT 2, 'Marseille, Nizza, Bordeaux, Cannes, Berlin') AS hp_regionen,
							--Simulation der Tabelle hp_maps_ville
							(SELECT 1 AS id, 'Nizza' AS nom UNION SELECT 20, 'Cannes' UNION SELECT 3, 'Berlin') AS hp_maps_ville
						WHERE
							FIND_IN_SET(nom, REPLACE(villages, ' ', ''))
						ORDER BY 
							id, 
							city_id
					) as dataset
				ORDER BY 
					id, 
					rnum DESC
			) AS ordered_1
	)AS ordered_2
WHERE
	visible
 
Zuletzt bearbeitet von einem Moderator:
Zurück