PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : array in Tabelle auswerten, Problem mit leerzeichen



zyrusthc
25-02-2007, 22:43
Hallo zusammmen.

Ich versuche ein Array in eine Tabelle auszuwerten.
Leider habe ich Probleme bei Leerzeichen von Playernamen und bei Namen die <> enthalten.
Hier mal mein Script:

<?php

// Array erstellen , so wie es der Gameserver über rcon zurückliefert bei 4 Spielern
$array = array(
1 => "ÿÿÿÿprint",
2 => "map: dm/mohdm2",
3 => "num score ping name lastmsg address qport rate" ,
4 => "--- ----- ---- --------------- ------- --------------------- ----- -----" ,
5 => "0 98 133 <Anton'-,-~:> 0 192.168.10.1:-3219 37323 5000",
6 => "1 45 35 * Point Blank * 50 192.168.10.1:12203 22628 15000",
7 => "2 33 400 {TRT}PiGeTa 0 192.168.10.1:12203 63952 5000",
8 => "3 82 64 niel<>priel 0 192.168.10.1:-3944 57187 30000",
9 => "",
10 => ")"
);

print_r ($array);

echo "<br><br><br>";
$playercount = count ($array);
?>


<table border="1">
<tr>
<td>

<?php
if ($playercount !=0){
echo '<tr>';
echo '<th>num</th>';
echo '<th>score</th>';
echo '<th>ping</th>';
echo '<th>name</th>';
echo '<th>lastmsg</th>';
echo '<th>address</th>';
echo '<th>qport</th>';
echo '<th>rate</th>';
echo '</tr>';
$x = 4;
while ($x <= $playercount) {
$x++;
$spielerinfo = explode(' ',$array[$x]);
echo "<tr>";
echo "<td>$spielerinfo[0]</td>";
echo "<td>$spielerinfo[1]</td>";
echo "<td>$spielerinfo[2]</td>";
echo "<td>$spielerinfo[3]</td>";
echo "<td>$spielerinfo[4]</td>";
echo "<td>$spielerinfo[5]</td>";
echo "<td>$spielerinfo[6]</td>";
echo "<td>$spielerinfo[7]</td>";
echo "</tr>";
} }
else
{
echo "Playerinfos";
echo "<td align=\"center\">Keine Player auf dem Server!</td>";
}

?>

</td>
</tr>
</table>

Damit bekomme ich jetzt bis Ping alles korrekt angezeigt , aber der Playername aus Schlüssel 5 wird gar nicht angezeigt, wegen den <> im Namen.
Nun zum grösseren Problem:
Vom Player mit Schlüssel 6 wird blos das erste Zeichen also das * angezeigt , und zur folge verschieben sich alle Werte in meiner Tabelle zum Schluss.

Das Ergebniss stelle ich mir aber so vor:
Schlüssel 5,6,7,8 usw. sollen in solcher Tabellenform ausgegeben werden

+-----------------------------------------------------------------------------------+
| num| score| ping | name | lastmsg | address | qport | rate |
+-----------------------------------------------------------------------------------+
| 0 | 98 | 133 | <Anton'-,-~:> | 0 | 192.168.10.1:-3219 | 37323 | 5000 |
+-----------------------------------------------------------------------------------+
| 1 | 45 | 35 | * Point Blank * | 50 | 192.168.10.1:12203 | 22628 |15000 |
+-----------------------------------------------------------------------------------+
| 2 | 33 | 400 | {TRT}PiGeTa | 0 | 192.168.10.1:12203 | 63952 | 5000 |
+-----------------------------------------------------------------------------------+
| 3 | 82 | 64 | niel<>priel | 0 | 192.168.10.1:-3944 | 57187 |30000 |
+-----------------------------------------------------------------------------------+

Kann mir jemand ne Anregung geben wie ich Spielername mit Leerzeichen in Griff bekomme?

Gruss Oli

Turbohummel
26-02-2007, 06:41
1. Frage: Liegt das Array in der Form vor oder kannst du die Form beeinflussen?

2. Frage: Hast du dich schon mal mit regulären Ausdrücken beschäftigt? falls nein: jetzt tun.

BlueJay
26-02-2007, 11:25
3.Frage: Kennst du die Segnungen von urlencode/urldecode?
4.Frage: Kennst du die Schönheiten von htmlentities und get_magic_quotes in Verbindung mit stripslashes()?

Aber nun was eher Praktisches:
Mach ruhig das split/explode mit ' ',
nehme Feld 0-2 für den 1.Teil der Daten, die Felder n-5 bis n-1 für den letzten, und Feld 3 bis n-6 implodierst du dann wieder und hast dann die Namen.

so long,
BlueJay

zyrusthc
27-02-2007, 09:20
Ich hab es inzwischen gepackt , das ich meiner Werte so wie ich wollte exploden kann.
Aber man hätte es bestimmt noch sauberer schreiben können :rolleyes: aber es funktioniert tadellos :)
Hier für die Nachwelt:

<?php

// Array erstellen , so wie es der Server zurückliefert bei 6 Spielern
$serverquery = array(
1 => "ÿÿÿÿprint",
2 => "map: dm/mohdm2",
3 => "num score ping name lastmsg address qport rate" ,
4 => "--- ----- ---- --------------- ------- --------------------- ----- -----" ,
5 => "0 98 133 <Anton'-,-~:> 0 192.168.10.1:-3219 37323 5000",
6 => "1 45 35 * Point Blank * 50 192.168.10.1:12203 22628 15000",
7 => "2 33 400 {TRT}PiGeTa 0 192.168.10.1:12203 63952 5000",
8 => "3 82 64 niel<>priel 0 192.168.10.1:-3944 57187 30000",
9 => "4 55 52 bla blub bla 0 192.168.10.1:-12203 54220 5000",
10 => "5 59 51 bla bla bla bla 0 192.168.10.1:-12203 54221 5000",
11 => "",
12 => ")"
);


// Ausgabe des Orginal Array`s
echo "Orginal<pre>\n";
print_r ($serverquery);
echo "</pre>\n";
echo "<br><br>";

$final_array = array(); // Array Erstellen

$playercount = count($serverquery) - 3; // Spieler zählen

if ($playercount !=0){ // Prüfe ob das Orginale Array Werte enhällt
$x = 4; // Start in Schlüssel 5
while ($x <= $playercount) { // Schleife starten
$x++;

$playerarray = preg_split('/ /', $serverquery[$x], -1, PREG_SPLIT_NO_EMPTY); // Zeile mit Playerinformationen in eigenes Array schreiben
$player_num = $playerarray[0]; // num in Variable schreiben
$player_score = $playerarray[1]; // score in Variable schreiben
$player_ping = $playerarray[2]; // ping in Variable schreiben

$playerarray = array_reverse($playerarray); // Array für weiterverarbeitung umkehren
$player_rate = $playerarray[0]; // rate in Variable schreiben
$player_qport = $playerarray[1]; // qport in Variable schreiben
$player_address = $playerarray[2]; // address in Variable schreiben
$player_lastmsg = $playerarray[3]; // lastmsg in Variable schreiben

// START Das Array beschneiden um den Playernamen mit leerzeichen zu bekommen //
$playername = array_reverse($playerarray); // Array für weiterverarbeitung umkehren
$name_count = count($playername) - 4; // Länge des Array ermitteln und um -4 verringern, also letzten 4 weniger.
for($i = 0; $i < $name_count; $i++) // Schleife
{
$schnitt_1[$i] = $playername[$i]; // Das alte Array in ein neues Array schreiben ohne die letzten 4 Werte
}

$playername_2 = array_reverse($schnitt_1); // Array für weiterverarbeitung umkehren
$name_count = count($playername_2) - 3; // Länge des Array ermitteln und um -3 verringern, also letzten 3 weniger.
for($a = 0; $a < $name_count; $a++) // Schleife
{
$schnitt_2[$a] = $playername_2[$a]; // Das alte Array in ein neues Array schreiben ohne die letzten 3 Werte
}

$playernamearray = array_reverse($schnitt_2); // Array für weiterverarbeitung umkehren
foreach($playernamearray as $playername_3) // Array durchlaufen... Playername zusammenfügen
{
$playername_final .= htmlentities($playername_3); // Das Parsen der HTML Tags unterbinden
$playername_final .= " "; // Leerzeichen nach jedem Schlüssel einfügen
}
$playername_final = substr($playername_final, 0, -1); //letztes Leerzeichen hinter dem Playernamen entfernen
// ENDE Das Array beschneiden um den Playernamen mit leerzeichen zu bekommen //

// Das Final Array füllen :)
array_push($final_array, "$player_num;$player_score;$player_ping;$playername _final;$player_lastmsg;$player_address;$player_qpo rt;$player_rate");

// Variablen für nächsten durchlauf löschen
unset($playername_final, $playernamearray, $playername, $playername_2, $schnitt_1, $schnitt_2);

} // Schleife Ende
} // If Abfrage Ende

// Ausgabe fertiges Array`s
echo "Nachher<pre>\n";
print_r($final_array);
echo "</pre>\n";

?>


Die Ausgabe:

Orginal
Array
(
[1] => ÿÿÿÿprint
[2] => map: dm/mohdm2
[3] => num score ping name lastmsg address qport rate
[4] => --- ----- ---- --------------- ------- --------------------- ----- -----
[5] => 0 98 133 0 192.168.10.1:-3219 37323 5000
[6] => 1 45 35 * Point Blank * 50 192.168.10.1:12203 22628 15000
[7] => 2 33 400 {TRT}PiGeTa 0 192.168.10.1:12203 63952 5000
[8] => 3 82 64 niel<>priel 0 192.168.10.1:-3944 57187 30000
[9] => 4 55 52 bla blub bla 0 192.168.10.1:-12203 54220 5000
[10] => 5 59 51 bla bla bla bla 0 192.168.10.1:-12203 54221 5000
[11] =>
[12] => )
)



Nachher
Array
(
[0] => 0;98;133;<Anton'-,-~:>;0;192.168.10.1:-3219;37323;5000
[1] => 1;45;35;* Point Blank *;50;192.168.10.1:12203;22628;15000
[2] => 2;33;400;{TRT}PiGeTa;0;192.168.10.1:12203;63952;50 00
[3] => 3;82;64;niel<>priel;0;192.168.10.1:-3944;57187;30000
[4] => 4;55;52;bla blub bla;0;192.168.10.1:-12203;54220;5000
[5] => 5;59;51;bla bla bla bla;0;192.168.10.1:-12203;54221;5000
)


Verbesserungsvorschläge sind natürlich willkommen.

Greeez Oli

undefined
27-02-2007, 17:01
Etwas Umständlich ;)


$out = array();
foreach( $array AS $k => $v ) {
if ( preg_match( "/^\d/", $v ) ) {
$v = htmlentities( $v, ENT_QUOTES, "UTF-8" );
$v = str_replace( " ","°", $v );
$v = preg_replace( "/([a-z])(°)([a-z])/i", "$1 $3", $v );
$out[$k] = explode( "°", $v );
}
}

var_dump( "<pre>", $out, "</pre>" );

Gaert
02-03-2007, 10:33
Ich hab es inzwischen gepackt , das ich meiner Werte so wie ich wollte exploden kann.
Aber man hätte es bestimmt noch sauberer schreiben können :rolleyes: aber es funktioniert tadellos :)

...irgendwas total abgefahrenes...Verbesserungsvorschläge sind natürlich willkommen.

Greeez Oli

Ogottogott,

mit einem


echo "<td>" . htmlentities($spielerinfo[0]) . "</td>";
hättst du dir schon viel Zeit sparen können.

Gruß,

Gaert

zyrusthc
07-06-2007, 18:27
Hallo

Habe im moment wieder etwas Zeit und hab mich hier noch mal etwas mit der Sache beschäftigt.

Mir ist am Anfang ein kleiner Fehler unterlaufen , und zwar baut sich das array etwas anders auf :
$status_antwort_data

Array
(
[0] =>
[1] =>
[2] => 0 0 CNCT BeZImiEnNy SZ. KL.1997150 88.220.xx.xx:12203 34362 10000
[3] => 1 2 62 p 134950 212.149.xx.xx:25641 18908 5000
[4] => 2 0 103 Essam 0 196.218.xx.xx:10643 42223 30000
[5] => 3 22 999 Yahoo 118150 90.31.xx.xx:12203 24967 25000
[6] => 4 0 999 manix 582900 83.198.xx.xx:12203 29811 25000
[7] => 5 64 59 UnnamedSoldier 50 217.84.xx.xx:12203 15321 10000
[8] => 6 5 28 vector 50 213.93.xx.xx:-869 62834 25000
[9] => 7 8 50 yourself 50 86.140.xx.xx:12203 7091 25000
[10] => 8 2 46 BOOM-KILLER 0 83.93.xx.xx:12203 44537 5000
[11] => 9 8 220 Prazeres 0 87.103.xx.xx:12203 25197 20000
[12] => 11 38 69 Mike Waht hack u use 250 82.174.xx.xx:12203 23044 5000
[13] => 13 0 37 dulex$$.TRF 0 87.79.xx.xx:12203 44982 25000
[14] => 14 7 23 /*Anton aus Tirol*/ 0 84.63.xx.xx:12203 14703 30000
[15] => 15 0 999 dA # louis 7500 77.216.xx.xx:12203 40562 25000
)


Ich habe jetzt etwas mit der foreach Schleife von undefined experementiert und habe das Problem das es zu Verschiebungen in der Tabelle kommt, da einige leerzeichen im array dafür sorgen das der falsche Wert für einen Key zurückgeliefert wird!
Ich habe bereits versucht verschiedene Zeichfolgen zu filtern aber es kommt immer wieder ein neuer Client mit ausgefallenden Namen das die Ausgaben sich verschieben.

Der Code sieht im moment wie folgt aus:


$array = array();
foreach( $status_antwort_data AS $k => $v ) {
if ( $status_antwort_data) {
$v = htmlentities( $v, ENT_QUOTES, "UTF-8" );
$v = str_replace( "²","", $v ); // ² fals vorhanden aus namen entfernen


//Zeichenvorkommen filtern die zu Problemen bei der Anzeige führen
$vorkommen = array(") ", " )", "( ", "( ", "* ", " *", "- ", " -", "| ", " |", ". ", " .", "[ ", " [", "] ", " ]");
$v = str_replace($vorkommen, "³", $v);

$v = preg_replace('/\s\s+/', ' ', $v); //unnötige leerzeichen entfernen
$v = substr($v, 1);
$v = str_replace("CNCT","999",$v);
$v = str_replace("ZMBI","Disconnect",$v);
$v = str_replace( " ","²", $v ); //neuen Trenner setzen
$v = preg_replace( "/([a-z])(²)([a-z])/i", "$1 $3", $v );

$v = str_replace("³", " ", $v);

$array[$k] = $v;
}
}


Der Code für die Tabelle:

//Spieleranzahl ermitteln
$playercount = count($array)-2;

//Tabelle fuer die Ausgabe
echo '<table border="1" align="center" width="780"><tr><td>';
if ($status_antwort_data){
echo '<tr>';
echo '<th><u>num</u></th>';
echo '<th><u>score</u></th>';
echo '<th><u>ping</u></th>';
echo '<th><u>name</u></th>';
echo '<th><u>lastmsg</u></th>';
echo '<th><u>address</u></th>';
echo '<th><u>cport</u></th>';
echo '<th><u>qport</u></th>';
echo '<th><u>rate</u></th>';
echo '<th><u>Kick</u></th>';
echo '<th><u>Ban</u></th>';
echo '</tr>';
$x = 0;
while ($x <= $playercount) {
$x++;
$spielerinfo = explode('²',$array[$x]);
echo "<tr>";
echo "<td align=center><font size=\"2\">$spielerinfo[0]</font></td>";
echo "<td align=center><font size=\"2\">$spielerinfo[1]</font></td>";

if($spielerinfo[2] == 999) echo "<td align=\"center\"><font size=\"2\" color=red>$spielerinfo[2]</font></td>";
elseif ($spielerinfo[2] > 100) echo "<td align=\"center\"><font size=\"2\" color=#F07C1D>$spielerinfo[2]</font></td>";
elseif ($spielerinfo[2] < 100) echo "<td align=\"center\"><font size=\"2\" color=green>$spielerinfo[2]</font></td>";
else echo "<td align=\"center\"><font size=\"2\" color=red>$spielerinfo[2]</font></td>";

echo "<td align=center><font size=\"2\">$spielerinfo[3]</font></td>";
echo "<td align=center><font size=\"2\">$spielerinfo[4]</font></td>";
$spielerip = explode(":", $spielerinfo[5]);
echo "<td align=center><font size=\"2\">$spielerip[0]</font></td>";
$spielerip[1] = str_replace( "-","", $spielerip[1] );
echo "<td align=center><font size=\"2\">$spielerip[1]</font></td>";
echo "<td align=center><font size=\"2\">$spielerinfo[6]</font></td>";
echo "<td align=center><font size=\"2\">$spielerinfo[7]</font></td>";
if($spielerinfo[3]) {
echo "<td width=15>
<FORM METHOD=Post ACTION=\"include.php?server=mohaaplayers\" NAME=\"kick_client\">
<INPUT Type=hidden Name=\"kick\" VALUE=\"$spielerinfo[0]\">
<INPUT Type=submit Name=\"kick_client\" VALUE=\"Kick\">
<INPUT Type=\"hidden\" Name=\"rconpass\" VALUE=\"$_POST[rconpass]\">
<INPUT Type=\"hidden\" Name=\"server_port\" VALUE=\"$_POST[server_port]\">
<INPUT Type=\"hidden\" Name=\"server_ip\" VALUE=\"$_POST[server_ip]\">
</FORM>";
echo "</td>";
}

if($spielerinfo[3]) {
echo "<td width=15>
<FORM METHOD=Post ACTION=\"include.php?server=mohaaplayers\" NAME=\"Ban\">
<input type=hidden name=Ban value=$spielerip[0]>
<INPUT Type=submit VALUE=\"Ban\">
</FORM>";
echo "</td>";
}

echo "</tr>";
}
}

Was dabei raus kommt seht ihr im Screenshoot im Anhang.
Client 0,11 und 15 sind solche Kadidaten!

Wenn ich die Playerinformationen in ein eigenes array schreiben lasse , so wie von undefined vorgeschlagen mit "$array[$k] = explode( "²", $v );" statt "$array[$k] = $v;" dann sieht die Ausgabe für Client 15 so aus:

[17] => Array
(
[0] => 15
[1] => 0
[2] => 999
[3] => dA
[4] => #
[5] => louis
[6] => 7500
[7] => 77.216.xx.xx:12203
[8] => 40562
[9] => 25000
)

Die brauche aber so eine ausgabe:

[17] => Array
(
[0] => 15
[1] => 0
[2] => 999
[3] => dA # louis
[4] => 7500
[5] => 77.216.xx.xx:12203
[6] => 40562
[7] => 25000
)
Kann mir jemand noch einen Tip geben wie das array so filtere das ich die kompletten Playernamen mit leerzeichen und sonstigen in $spielerinfo[3] habe?

Gruss Oli

Turbohummel
08-06-2007, 06:21
Zäume das Pferd von hinten auf.
Sprich: Du hast bis zum Namen nur Zahlen (wo in der Regel keine Leerzeichen drin vorkommen). Also nimmst du erstmal wie gehabt bis zum Namen von vorne her auseinander.
Da beim Namen auch Leerzeichen auftreten können, weißt du dann nicht mehr, wos mit der nächsten Spalte weitergeht.
Deswegen schnappst du dir jetzt die letzte Spalte, dann die vorletzte. Bis nur noch eine über ist ... und das muss ja dann der Name sein.
Entweder du machst das schon beim auseinandernehmen, oder beim Array. 0, 1 und 2 als erste elemente, dann von hinten anfangen, den höchsten Key ermitteln -> Key -1, Key -2 sind die nächsten Felder.
Dann bleibt der Name über mit 3, 4 und 5. Dann bastelst du das übergebliebene in einen String zusammen. Fertig.

zyrusthc
08-06-2007, 06:38
Jo auf sowas bin ich inzwischen auch gekommen , habe das ganze in drei array`s aufgeteilt.

TEIL:1

Array
(
[0] =>
[1] =>
[2] => 1 0 999
[3] => 2 3 48
[4] => 23 11 107
[5] => 25 0 CNCT
[6] => 3 0 31
)

TEIL:2

Array
(
[0] =>
[1] =>
[2] => Teniente Infante
[3] => Pakito
[4] => Bad-Co-Hunter
[5] => Private Ryan
[6] => iMpulZ!
)

TEIL:3

Array
(
[0] =>
[1] =>
[2] => 100 190.46.xx.xx:12203 45063 25000
[3] => 0 83.238.xx.xx:12203 8811 30000
[4] => 50 24.151.xx.xx:12203 3234 25000
[5] => 2173450 189.141.xx.xx:12203 55695 25000
[6] => 50 87.97.xx.xx:12203 15417 30000
)



$teil1 = array();
foreach( $status_antwort_data AS $k => $v ) {
if ( $status_antwort_data) {
$v = explode( " ", $v);
$v = "$v[1] $v[2] $v[3]";
$teil1[$k] = $v;
}
}

$teil2 = array();
foreach( $status_antwort_data AS $k => $v ) {
if ( $status_antwort_data) {
$v = htmlentities( $v, ENT_QUOTES, "UTF-8" );
$test = strrpos($v, " ");
$v = substr($v, strpos($v, ' ') + 1);$v = substr($v, strpos($v, ' ') + 1);$v = substr($v, strpos($v, ' ') + 1);$v = substr($v, strpos($v, ' ') + 1);
$v = strrev($v);
$v = substr($v, strpos($v, ' ') + 1);$v = substr($v, strpos($v, ' ') + 1);$v = substr($v, strpos($v, ' ') + 1);$v = substr($v, strpos($v, ' ') + 1);
$v = strrev($v);
$teil2[$k] = $v;
}
}

$teil3 = array();
foreach( $status_antwort_data AS $k => $v ) {
if ( $status_antwort_data) {
$v = strrev($v);
$v = explode( " ", $v);
$v = "$v[0] $v[1] $v[2] $v[3]";
$v = strrev($v);
$teil3[$k] = $v;
}
}
Find ich zwar nicht ganz so schön, aber vielleicht hat ja jemand noch ne Idee wie man es besser machen könnte.

Greeez Oli