Array mit Datenbankabfrage füllen und in einer Schleife ausgeben

Joe

Erfahrenes Mitglied
Abend.

Ich bin leider mit Arrays noch so garnicht warm geworden oder es fehlt mir schlicht tiefergreifendes Wissen.
Also Ich will die Usernamen aus der DB in ein Array lesen und sie dann in einer Schleife ausgeben lassen.
Die Schleife erzeugt eine Html Table map für eine Karte mit Koordinaten.
Soweit funktioniert alles nur komm ich einfach nicht drauf wie ich das Array dort einbinden könnte.. Ich nehme an es müste ein assoziatives Array sein?

Hier mal der Codeaussnitt:
PHP:
{
$sql = "SELECT
			Username,
			PosX,
			PosY
		FROM
			User
		WHERE
			PosX >=$NearestKoordsX1 AND PosX < $NearestKoordsX2 AND
			PosY >=$NearestKoordsY1 AND PosY < $NearestKoordsY2";
	$result = $db->query($sql);
	if (!$result) {
		die ('Etwas stimmte mit dem Query nicht: '.$db->error);
	}
	while ($row = $result->fetch_assoc()) {
		$PosXOtherPlayer= $row["PosX"];
		$PosYOtherPlayer= $row["PosY"];
		$User= $row["Username"];
		$PosX[] = $row["PosX"];
		$PosY[] = $row["PosY"];
		$koordArray[$row['PosX']][$row['PosY']] = $row['Username'];
	}
}

//// Anzeige aller Positionen
echo "<map name=\"map\">";			//HTMLCode Anfangstag soll ein "Mouseover" zum anzeigen der Namen und Positionen gennerieren.
for ($PosXNoPlayer=$NearestKoordsX1; $PosXNoPlayer<$NearestKoordsX2; $PosXNoPlayer++) {
	for ($PosYNoPlayer=$NearestKoordsY1; $PosYNoPlayer<$NearestKoordsY2; $PosYNoPlayer++) {
		if (isset($koordArray[$PosXNoPlayer][$PosYNoPlayer]) && $koordArray[$PosXNoPlayer][$PosYNoPlayer] != "") {
			$Titlepos = array(($PosXNoPlayer - $UserMapX)*10+$DIVmitteX-6,
							($PosYNoPlayer - $UserMapY)*10+$DIVmitteY-6,
							($PosXNoPlayer - $UserMapX)*10+$DIVmitteX+4,				//Array für Title(und oder Link)-generirung Positionen
							($PosYNoPlayer - $UserMapY)*10+$DIVmitteY+4);
			echo "<area shape=\"rect\" coords=\"$Titlepos[0],$Titlepos[1],$Titlepos[2],$Titlepos[3]\" 
				href=\"main.php?section=erkunden\" title=\"$Username $PosXNoPlayer,$PosYNoPlayer\">\n";   //HTMLCode Position und Titel
		}
		else {
		 $Titlepos = array(($PosXNoPlayer - $UserMapX)*10+$DIVmitteX-6,
						   ($PosYNoPlayer - $UserMapY)*10+$DIVmitteY-6,
						   ($PosXNoPlayer - $UserMapX)*10+$DIVmitteX+4,				//Array für Title(und oder Link)-generirung Positionen
						   ($PosYNoPlayer - $UserMapY)*10+$DIVmitteY+4);
		echo "<area shape=\"rect\" coords=\"$Titlepos[0],$Titlepos[1],$Titlepos[2],$Titlepos[3]\" 
			href=\"main.php?section=erkunden\" title=\"$PosXNoPlayer,$PosYNoPlayer\">\n";		//HTMLCode Position und Titel
		}
	}
}
echo "</map>"; 															//HTMLCode schliessendes Maptag.. erst hier ist die Maptabelle vollständig.
echo "<img src='img/MAP1_$Mapowner.jpg' width='543' height='432' border='0' alt='Karte' usemap='#map'>"; //zeigt Karte mit Positionen und Mouseover

Irgendwie find ich das auch etwas unpraktisch und unflexibel so kann man zb nur die nächste Seite "erkunden" aufrufen aber nicht das Profil. Ich frage mich ob Javascript dafür nicht doch besser geeignet wäre? Auch scheint es mir das die GD-LIB schneller mal eben 10 Bilder kopieren kann als das PHP den Code zur Tabelle hier geparst hat. (Ist natürlich nur subjektives empfinden)

Grüsse Joe.


Nachtrag:
Hmm vieleicht habe ich mich ungenügend ausgedrückt.
Dieser Zeile aus der obrigen For-Schleife soll dann den passenden Usernamen zeigen.
Wie müsste ich das Array mit den Datenbankwerten füllen und wie würde man es in der Schleife auslesen?
PHP:
			echo "<area shape=\"rect\" coords=\"$Titlepos[0],$Titlepos[1],$Titlepos[2],$Titlepos[3]\" 
				href=\"main.php?section=erkunden\" title=\"$Username $PosXNoPlayer,$PosYNoPlayer\">\n";   //HTMLCode Position und Titel

Ich rätsel und googel schon beinahe 3 Tage aber komme einfach nicht hinterher wie das array zu realisieren ist. Bin dankbar für jeden Denkanstoss.

Ist es nicht irgendwie möglich aus einem Array wie zb:
PHP:
$koordArray[$row['PosX']][$row['PosY']][$row["Username"]]= $row['Username'];
den Username anhand der PosX AND PosY auszulesen?

Also Ich meine das so:
Code:
Schleifenkopf: (Gehe alle Pos durch)
Wenn PosX AND PosY existieren dann echo den entsprechenden Username.
Oder tu was andres.
Schleifenende.

Bin nicht der Typ der im coden etwas gern aufgibt ich kann mir nicht denken das Arrays sowas nicht leisten können. Nur seh ich da einfach nur kein Ansatz wie das zu bewerkstelligen wäre. Irgendwie beschleicht mich das Gefühl das dies kein gewöhnliches Array ist wie mans sonst in Tutorials so lernen könnte.

Grüse Joe.
 

Sven Mintel

Mitglied
Moin Joe,

wenn auch recht wirr, so sieht das auf den 1. Blick jedoch nicht falsch aus.
Das einzige was ich vermisse, ist hier:
Code:
echo "<area shape=\"rect\" coords=\"$Titlepos[0],$Titlepos[1],$Titlepos[2],$Titlepos[3]\" 
            href=\"main.php?section=erkunden\" title=\"$Username $PosXNoPlayer,$PosYNoPlayer\">\n";   //HTMLCode Position und Titel
...da ist keine Variable $Username.

du müsstest da eingangs etwas in der Art notieren:
Code:
$Username=$koordArray[$PosXNoPlayer][$PosYNoPlayer]

Rein generell:
Es scheint sich da um ein Browsergame zu handeln, nehme ich mal an.

Da könnte mab also aktiviertes JS allemal vorraussetzen, ich würde es daher auch einsetzen.

Das erspart dir, alle Koordinaten durchzulaufen....es dürfte weitaus schneller gehen, wenn du nur die "belegten" berücksichtigst.
 
  • Gefällt mir
Reaktionen: Joe

Joe

Erfahrenes Mitglied
Moin Sven,

Ja ist richtig will ein BG werden an dem ich da schreibe.
Die Variable $Username wurde wo anders im Templatescript deklariert. Aber du hast das Problem haargenau erkannt. Die Variable würde mir nur einen Namen anzeigen können und das eben in Schleife der Bedingung. Ich habs mehr oder weniger drinn gelassen um zu fragen/zeigen wie ich das als Array lösen müsste.

PHP:
echo "<map name=\"map\">";			//HTMLCode Anfangstag soll ein "Mouseover" zum anzeigen der Namen und Positionen gennerieren.
for ($PosXNoPlayer=$NearestKoordsX1; $PosXNoPlayer<$NearestKoordsX2; $PosXNoPlayer++) {
	for ($PosYNoPlayer=$NearestKoordsY1; $PosYNoPlayer<$NearestKoordsY2; $PosYNoPlayer++) {
		if (isset($koordArray[$PosXNoPlayer][$PosYNoPlayer]) && $koordArray[$PosXNoPlayer][$PosYNoPlayer] != "") {
			$Player=$koordArray[$PosXNoPlayer][$PosYNoPlayer];
			$Titlepos = array(($PosXNoPlayer - $UserMapX)*10+$DIVmitteX-6,
							($PosYNoPlayer - $UserMapY)*10+$DIVmitteY-6,
							($PosXNoPlayer - $UserMapX)*10+$DIVmitteX+4,				//Array für Title(und oder Link)-generirung Positionen
							($PosYNoPlayer - $UserMapY)*10+$DIVmitteY+4);
			echo "<area shape=\"rect\" coords=\"$Titlepos[0],$Titlepos[1],$Titlepos[2],$Titlepos[3]\" 
				href=\"main.php?section=erkunden\" title=\"$Player $PosXNoPlayer,$PosYNoPlayer\">\n";   //HTMLCode Position und Titel
		}
		else {
		 $Titlepos = array(($PosXNoPlayer - $UserMapX)*10+$DIVmitteX-6,
						   ($PosYNoPlayer - $UserMapY)*10+$DIVmitteY-6,
						   ($PosXNoPlayer - $UserMapX)*10+$DIVmitteX+4,				//Array für Title(und oder Link)-generirung Positionen
						   ($PosYNoPlayer - $UserMapY)*10+$DIVmitteY+4);
		echo "<area shape=\"rect\" coords=\"$Titlepos[0],$Titlepos[1],$Titlepos[2],$Titlepos[3]\" 
			href=\"main.php?section=erkunden\" title=\"$PosXNoPlayer,$PosYNoPlayer\">\n";		//HTMLCode Position und Titel
		}
	}
}
echo "</map>"; 															//HTMLCode schliessendes Maptag.. erst hier ist die Maptabelle vollständig.
echo "<img src='img/Usermaps/MAP1_$Mapowner.jpg' width='543' height='432' border='0' alt='Karte' usemap='#map'>"; //zeigt Karte mit Positionen und Mouseover

Code:
$Username=$koordArray[$PosXNoPlayer][$PosYNoPlayer]
Gibt als Ausgabe (array) Posx PosY.
Anstatt der Name steht halt dort immer (array).
Ist also noch nicht ganz richtig.


Da könnte mab also aktiviertes JS allemal vorraussetzen, ich würde es daher auch einsetzen.

Das erspart dir, alle Koordinaten durchzulaufen....es dürfte weitaus schneller gehen, wenn du nur die "belegten" berücksichtigst.

Ja das denke ich mir auch. Wollte es anfangs strikt vermeiden da fast jedes Tut davon redet man solle die User nicht gängeln oder mancherortens von Sicherheit der User die Rede ist. Aber in nachhinein gesehen absoluter Blödsinn.. Es gibt kaum ne Site mit grösseren Projekt wo man nicht Java braucht.
Wollte mir wohl auch beweisen das es gänzlich ohne Javascript geht. Aber in Hinblick auf Performance und Last scheint es bald unumgänglich script zu nutzen.

Die Koordinaten alle durchzugehen ist wichtig da überall die Position gezeigt werden soll einerseits der Übersicht anderseits wegen Spiel-Bewegungsfunktionen.
Übrigens das ganze hatte bereits funktioniert allerdings innerhalb der MySQL Schleife und da sollte es raus um später zu prüfen ist die MAP_TABLE schon vorhanden.. also Rechenarbeit sparen.

Wie würde denn das Äquivalent zu Map_table in Javascript heissen? Oder wie würde ich ein einzelnes grosses Image (meine Tiles haben die grösse des Divs der den Kartenausschnitt zeigt) verweissensitiv machen?
Kannst du mir 1-2 Javascript Befehle sagen welche ich mir mal näher anschauen kann?
 

Sven Mintel

Mitglied
Die Koordinaten alle durchzugehen ist wichtig da überall die Position gezeigt werden soll einerseits der Übersicht anderseits wegen Spiel-Bewegungsfunktionen.
Übrigens das ganze hatte bereits funktioniert allerdings innerhalb der MySQL Schleife und da sollte es raus um später zu prüfen ist die MAP_TABLE schon vorhanden.. also Rechenarbeit sparen.

Wie würde denn das Äquivalent zu Map_table in Javascript heissen? Oder wie würde ich ein einzelnes grosses Image (meine Tiles haben die grösse des Divs der den Kartenausschnitt zeigt) verweissensitiv machen?
Kannst du mir 1-2 Javascript Befehle sagen welche ich mir mal näher anschauen kann?

Naja, mit Javascript kannst du schliesslich Events überwachen.
Wenn du ein Grosses Bild hast, dann kannst du dort bspw. click,mouseover und mousemove überwachen, und jedesmal würdest du unter anderem auch die Koordinaten erhalten, in denen der Event feuert.

Angesichts dessen könntest du bspw. die vorhandenen Daten für JS in einem Array ablegen.
Beim jeweiligen Event schaust du dann nach, ob zu den Koordinaten etwas im Array ist(Spieler)...und gibst die Info dazu aus.
Ist nichts vorhanden, gibst du nur die Koordinaten aus.
 
  • Gefällt mir
Reaktionen: Joe

Joe

Erfahrenes Mitglied
Hey Sven,

Sorry deine Lösung war völlig richtig :-(
Ich hatte noch ein zusätzliches Array drinnen und deswegen ging es nicht. Gemerkt hab ichs erst nachdem ich ne andre Lösung gefunden habe:
Code:
$Name =print_r ($koordArray[$PosXNoPlayer][$PosYNoPlayer], true);
Naja ist genau das selbe wie deine Variante keine Ahnung wieso mir das nicht aufgefallen war. Wieder was dazu gelernt :)

Ja wegen Javascript das muss ich mir erstmal genauer anschauen Eventhandler usw. Die Map_table scheint das selbe zur sein man muss ebenfalls alles mit HTML und Shape Rects anlegen aber die Mousover und Mouseout und Events lassen da einiges an Spielmöglichkeiten die ich sicher noch brauche (zb wenn mehrere Player an einem Punkt und deren Profil anklicken). Hab mich aber mit Javascript noch nie beschäftigt und die Funktionen schrecken nen wenig ab.
Aber werd mich schon durchfriemeln :)

Also vielen Dank für die wie immer kompetente Hilfe Sven.

Grüsse Joe.