PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : string zerschneiden


JuliusCaesar
03.01.2008, 21:40:43
Hey es ist mal wieder soweit, ich brauche eure Hilfe^^
und zwar:
ich habe einen string:
(auch wenn es so aussehen mag, dies ist nicht der quelcode, sondern einfach nur eine kopie der Seite

0 Spionagesonde 0 Recycler
<!-- empty result --> *|*|*34 *|*464 *|*planet_18_small *|*22 *|*1 *|*<br><font color="#55bb39"><b>Kolonie</b></font><br>(<font color="#55bb39">JuliusCaesar1</font>)*|*0 *|*Kolonie*|*06:174:01 *|*<table border=0 width=100% cellpadding=1 cellspacing=0> <tr> <td width=80 class=rahmen>Besitzer</td> <td ......


Sonne
1
Kolonie
(JuliusCaesar1)
2
baby-blu
(oberzicke123)
...
(hier soll geschnitten werden)

0 Spionagesonde 0 Recycler
<!-- empty result --> *|*|*83 *|*513 *|*planet_34_small *|*22 *|*1 *|*<br><font color="#347187"><b>Kratos</b></font><br>(<font color="#347187">Lordi³</font>)*|*0 *|*Kratos*|*06:175:01 *|*<table border=0 width=100% cellpadding=1 cellspacing=0> <tr> <td width=80 class=rahmen>Besitzer</td> <td width=150


Sonne
1
Kratos
(Lordi³)
2
cst kampfstern
(sven_26)
3
Kolonie
(gerard60)

(hier soll nochmal geschnitten werden)



ich habe es erst mit explode versucht
$text = explode("Sonne", $_POST['text']);
dadurch wurde der string in 3 teile geteilt (eigentlich sollten es nur 2 sein)
und er hat den string hinter "Sonne" abgeschnitten, ich benötige das "Sonne" aber zwingend noch im String, damit der rest code funktioniert

alos habe ich mich nahc ner andren Funktion umgesehen, und mir ist strpos eingefallen
im manual steht aber
Gibt die numerische Position des ersten Vorkommens (..) wieder

Problem:die Schnittstelle "Sonne" kommt mehrmals vor
habt ihr auch dafür ne Lösung?


danke schonmal
mfg Julius

Katachi
04.01.2008, 18:31:10
Einfach die Rückgabeposition von strpos nochmals verwenden als offset innerhalb des nächsten strpos. So lange bis du ein false kriegst.

Hier mal pseudocode:

pos = strpos(source,suchwort)
while(pos!=false)
{
/*tu etwas mit der Zeichenkette von letzter pos - pos*/
[...]
/*nun gehe zum nächsten treffer (z.b. sonne)*/
pos = strpos(source,suchwort,pos+1)
}

Hoffe das hilft

JuliusCaesar
05.01.2008, 04:28:49
abend
danke erstmal für die Antwort

beudtet dieser teil (while(pos!=false)) dass die einzellen Zeilen durchgegsngen werden
wenn ich sage:
while(pos!=false) dann fällt doch praktisch nur die Zeile heraus in der sich das suchwort befindet,oder?


und wie kann ich festlegen,dass er sich zuerst nur den 1.teil vornehmen soll,dann den 2. usw...

z0iD
05.01.2008, 06:50:59
Also wenn ich das richtig verstehe, hast Du eine Zeichenkette, in der alle gesuchten Teilstücke von einer Zeichenkette (etwa "Sonne") eingeleitet werden. Also etwa so:
Sonne
Block 1[..]
Sonne
Block 2[..]
Sonne
Block 3[..]

Meiner Ansicht ist das eigentlich gut mit explode lösbar.
Du musst nur am Ergebnis von explode etwas rumbasteln.

Erstmal musst Du das erste Element verwerfen. Das geht mit unset($result[0]); wobei die Indizes dabei erhalten bleiben, das heißt, dass das resultierende Feld bei 1 und nicht bei 0 beginnt. Soll es unbedingt bei 0 beginnen hilf ein Aufruf von array_values();.
Nun musst Du noch das Trennzeichen (hier "Sonne") an den Anfang aller Werte anfügen. Das ist auf zwei Arten möglich. Entweder Du durchläufst einfach das gesamte Feld und fügst vor jedes Element einfach Dein Trennwort ein, oder Du präparierst die Zeichenkette vor dem Aufruf von explode() einfach so, dass das dabei rauskommt was Du haben willst (etwa "Sonne" ersetzen durch "\**/Sonne" und explode mit dem Trennzeichen "\**/" aufrufen und nicht mit "Sonne" - dann darf natürlich \**/ in der eigentlichen Zeichenkette nicht auftauchen).

JuliusCaesar
05.01.2008, 22:38:43
da sis tnu gute idee,danke
aber dieses hinzufügen des Trennworts vor Sonne bereitet mir probleme

kann ich da auch

str_replace("Sonne", "/**/Sonne", $string);


müsste doch ansich gehen oder?
ne andere Funktion fällt mir nämlich nicht ein...

z0iD
05.01.2008, 22:54:23
Genauso meinte ich das.
Problem ist aber, dass es \**/ bereits geben könnte.

Als Begrenzung kann jedoch prinzipiell alles dienen. Auch eine Zahl. Das einfachste wäre wohl eine Zahl zu suchen die nicht in der Zeichenkette vorhanden ist. Das könnte man etwa so machen:
$trennzeichen = 0;
while (strpos($deinezeichenkette,$trennzeichen) !== false)
$trennzeichen++;


Mir ist klar, dass der Algorithmus potentiell recht lange dauern kann (er terminiert aber auf jeden Fall). Abhängig davon was Du für Texte benutzt kannst Du ihn aber salzen, indem Du unwahrscheinliche Zeichenketten voranstellst, oder bei einer großen Zahl (statt 0) anfängst.

JuliusCaesar
06.01.2008, 00:13:12
ansich funkt das, aber sobald ich das unset mit einbringe gibts ne parse error

Parse error: syntax error, unexpected T_UNSET in xxxx\si-stats\einlesen2.php on line 125

//Trennwort einfügen
$text_modif = str_replace("Sonne", "/abcde/Sonne", $_POST['text']);

//Text hinter Trennwort(/abcde/) aufspalten
$text_arr = explode("/abcde/", $text_modif);

$new_arr_1 = unset($text_arr[0]); //Zeile 125

$new_arr = array_values($new_arr_1);


echo "<pre>";
print_r($new_arr);
echo "</pre>";

geht unset nicht bei arrays?

zweites Problem:
einer der Spieler hat seinen Planeten "schwarze Sonne" geannt
auch hier wird das /abcde/ vor Sonne gesetzt, und dort dann auch (fälschlicherweise) der string aufgeteilt,
er darf nur an den Stellen aufteilen wo im string steht

Sonne
1
wie bekomme ich den Zeilenumbruch, und die 1 in das str_replace?

defabricator
06.01.2008, 00:33:10
$x = unset(...) geht nicht.

defabricator
06.01.2008, 00:37:32
Der Javascriptcode der Seite splittet nach *|*|* auf. Das kannst Du auch tun.

z0iD
06.01.2008, 01:00:29
Also erstmal geht es hier nicht um Javascript, defabricator.

Ferner musst Du unset wie folgt benutzen:unset($text_arr[0]);
statt$new_arr_1 = unset($text_arr[0]);

defabricator
06.01.2008, 01:09:13
Also erstmal geht es hier nicht um Javascript, defabricator.und zweitmal kannst Du es trotzdem bei *|*|* zerlegen. Oder haben die Illuminaten da eine geheime Sperre bei split/explode eingebaut?

Ferner musst Du unset wie folgt benutzen:unset($text_arr[0]);
statt$new_arr_1 = unset($text_arr[0]);Ja, sag ich doch, Schlaubi.

z0iD
06.01.2008, 01:14:45
Hast Du auch konstruktive Beiträge zu bieten?

defabricator
06.01.2008, 01:18:05
Ja, OP soll wie das Javascript der Originalseit bei *|*|* aufteilen.
Was war doch gleich Dein wertvoller Kommentar dazu?

JuliusCaesar
06.01.2008, 02:04:48
danke das mit dem unset klappt jetzt
aber zu meinem 2.problem
und zweitmal kannst Du es trotzdem bei *|*|* zerlegen. Oder haben die Illuminaten da eine geheime Sperre bei split/explode eingebaut?
es ist abe rnicht festgelegt dass "*|*|* "im string vorkommt, es kann vorkommen..
das einzige,was immer vorkommt und was man auch verwerten kann ist "Sonne"
nur wie gesagt, es treten halt Probleme auf wenn sich der Spieler oder Plani irgendwas mit "Sonne" heißt...

defabricator
06.01.2008, 02:08:44
es ist abe rnicht festgelegt dass "*|*|* "im string vorkommt, es kann vorkommen..Weil manchmal die gesamte Zeile beginnend mit <!-- empty result --> fehlt? Ist das browserabhängig? Anhand *|*|* macht es wie gesagt der Originalcode fest und da es in Deinem Zitat im ersten Post enthalten ist ...

JuliusCaesar
06.01.2008, 04:01:49
ups ich hatte nur auf das ende geachtet^^
ich bin mir nicht sicher ob das jedes mal vorkommt
vorallem,da ich nicht weiß,wieso ein html code beim kopieren der Seite mit STRG+A übernommen wird...
ich muss erst testen obs wirklich bei allen browsern funkt
daher wäre mir lieber,wenn man sich irgendwie auf das "Sonne" bezuieht..

defabricator
06.01.2008, 04:18:24
Na gut, dann halt Sonne<?php
$_POST['text'] = ' 0 Spionagesonde 0 Recycler
<!-- empty result --> *|*|*34 *|*464 *|*planet_18_small *|*22 *|*1 *|*<br><font color="#55bb39"><b>Kolonie</b></font><br>(<font color="#55bb39">JuliusCaesar1</font>)*|*0 *|*Kolonie*|*06:174:01 *|*<table border=0 width=100% cellpadding=1 cellspacing=0> <tr> <td width=80 class=rahmen>Besitzer</td> <td ......


Sonne
1
Kolonie
(JuliusCaesar1)
2
baby-blu
(oberzicke123)
...
(hier soll geschnitten werden)

0 Spionagesonde 0 Recycler
<!-- empty result --> *|*|*83 *|*513 *|*planet_34_small *|*22 *|*1 *|*<br><font color="#347187"><b>Kratos</b></font><br>(<font color="#347187">Lordi³</font>)*|*0 *|*Kratos*|*06:175:01 *|*<table border=0 width=100% cellpadding=1 cellspacing=0> <tr> <td width=80 class=rahmen>Besitzer</td> <td width=150


Sonne
1
Kratos
(Lordi³)
2
cst kampfstern
(sven_26)
3
Kolonie
(gerard60)

(hier soll nochmal geschnitten werden)';

$sonnensysteme = array();

$text = array_map('trim', explode("\n", $_POST['text']));
for($i=0; $i<count($text); $i++) {
if ($text[$i]==='Sonne') {
$i++;
$planeten = array();
while($i+2<count($text)) {
if (ctype_digit($text[$i]) && $text[$i+2][0]==='(' && $text[$i+2][strlen($text[$i+2])-1]===')') {
$planeten[$text[$i]] = array('name'=>$text[$i+1], 'besitzer'=>substr($text[$i+2],1, -1));
$i+=3;
}
else {
break;
}
}
$sonnensysteme[] = $planeten;
}
}
print_r($sonnensysteme);Array
(
[0] => Array
(
[1] => Array
(
[name] => Kolonie
[besitzer] => JuliusCaesar1
)

[2] => Array
(
[name] => baby-blu
[besitzer] => oberzicke123
)

)

[1] => Array
(
[1] => Array
(
[name] => Kratos
[besitzer] => Lordi³
)

[2] => Array
(
[name] => cst kampfstern
[besitzer] => sven_26
)

[3] => Array
(
[name] => Kolonie
[besitzer] => gerard60
)

)

)

Katachi
06.01.2008, 17:51:39
abend
danke erstmal für die Antwort

beudtet dieser teil (while(pos!=false)) dass die einzellen Zeilen durchgegsngen werden
wenn ich sage:
while(pos!=false) dann fällt doch praktisch nur die Zeile heraus in der sich das suchwort befindet,oder?


und wie kann ich festlegen,dass er sich zuerst nur den 1.teil vornehmen soll,dann den 2. usw...

Hallo,

hab mir jetzt die anderen Antworten nicht durchgelesen, deswegen antworte ich jetzt nur direkt auf die Frage.

pos ist nur false (also 0) wenn strpos() Sonne nicht gefunden hat. Du kannst also davon ausgehen, dass immer wenn strpos() Sonne findet "pos" dann auch immer ungleich (!=) false ist. Deswegen wird der Code von while(){ code } auch solange ausgeführt wie ein "Sonne" gefunden wurde.

pos ist dann also die Zeichenposition wo "Sonne" gefunden wurde. Nennen wir diese

Sonne-position A

Von dieser gefundenen Position "Sonne-position A" aus, kannst du dann das nächste "Sonne" mit strpos() suchen. Du lässt also strpos von der Position "Sonne-position A" das nächste Sonne suchen. Wenn er dies findet, dann hast du "Sonne-position B".

Du kannst jetzt mit substr z.b. den Text zwischen "Sonne-position A" und "Sonne-position B" extrahieren und verwenden/verarbeiten. Da es eine Schleife ist, läuft dieser Vorgang also so lange bis kein "Sonne" mehr gefunden wurde.

Hoffe das hilft

defabricator
06.01.2008, 22:37:56
Ich habe nur bispos ist nur false (also 0) wenn strpos() Sonne nicht gefunden hat. gelesen. das (also 0) streichen. strpos gibt FALSE zurück, wenn die Zeichenkette nicht gefunden wurde. 0 bedeutet, dass die Zeichenkette gleich am Anfang gefunden wurde.var_dump(strpos('abcd', 'ab'));
var_dump(strpos('abcd', 'yz'));int(0)
bool(false)

Katachi
08.01.2008, 15:24:52
Ich habe nur bisgelesen. das (also 0) streichen. strpos gibt FALSE zurück, wenn die Zeichenkette nicht gefunden wurde. 0 bedeutet, dass die Zeichenkette gleich am Anfang gefunden wurde.

Hmm, also ich bin eigentlich C++/Java Programmierer und weiß nicht wie False in PHP definiert ist, aber normalerweise ist False immer ein numerisch definierter Wert, in den meisten Fällen als integer deklariert, und entspricht 0, da Bool kein eigenständiger Typ ist sondern eine Typdefinition.

Wie ist false in PHP definiert? Meine tests bestätigten mir eigentlich dass False==0 ist, aber das weiß ich nicht gneau. Kannst du die Definition bitte posten?

Katachi
08.01.2008, 15:43:51
ok, ich hab mich mal schlau gemacht. Wie gesagt, auch PHP gibt einen typecast zu false. 0 wird also als automatisch zu false getypecasted, somit ist meine Annahme wohl richtig. Bei strpos ist das aber wie von defabricator korrekt beschrieben problematisch weil strpos auch 0 zurückgibt wenn das erste Zeichen gesucht ist. Also in diesem fall statt meiner 0 einfach false nutzen.

z0iD
08.01.2008, 17:44:13
Nein das ist nicht korrekt. Im Gegensatz zu C oder anderen Programmiersprachen (PHP ist keine!) speichert eine Variable nicht nur ihren Wert sondern auch Ihren Typ. bool ist durchaus ein eigentständiger Typ und nicht das gleiche wie int.
Es gibt in PHP den === Operator der nicht nur auf Gleichheit prüft sondern auf Identität (Typen gleich und Werte gleich). Wenn man den == Operator nimmt, konvertiert PHP sich das so zurecht dass er das irgendwie vergleichen kann.

Vgl. folgendes Beispiel: $b = false;
$i = 0;
$s = '0';

var_dump($b,$i,$s); //gibt aus: bool(false) int(0) string('0')

if ($b == $i)
echo 'false == 0'; //wird ausgegeben!
if ($b === $i)
echo 'false === 0'; //wird nicht ausgegeben!
if ($b === (bool)$i)
echo 'false === (bool)0'; //wird ausgegeben!
Beispielquelltext aus dem Kopf und nicht getestet, es kann natürlich geringe Abweichungeng geben.


Gleiches gilt natürlich auch für andere Werte wie true bzw. 1 - sie sind zwar gleich, aber nicht identisch.

JuliusCaesar
08.01.2008, 23:02:41
hey
sorry für die verspätete Antwort, aber irgendwas stimmte mit eurer Seite nicht, kam immer "File not found" oder so

auch jedenfall, dickes Dankeschön an defabricator
der code läuft zu 99%

nur bei einer galaxie nicht...


DAS HIER GEHT
0 Spionagesonde 0 Recycler
<!-- empty result --> *|*|*14 *|*434 *|*planet_33_small *|*22 *|*1 *|*<br><font color="#347187"><b>Hades 3</b></font><br>(<font color="#347187">deadaluss</font>)*|*0 *|*Hades 3*|*01:03:01 *|*<table border=0 width=100% cellpadding=1 cellspacing=0> <tr> <td width=80 class=rahmen>Besitzer</td> <td width=150 class=nachricht> <a ...
class=nachricht> <b><font color="#347187">Im Urlaubsmodus</font></b></td> </tr> </table> *|* 0 *|*14 *|*583 *|*23 *|*0*|*48

Sonne
1
Hades 3
(deadaluss)
2
Companie Alpha
(cousinhoub)
3
Hades 4
(deadaluss)
4
Dune
(-=[Bosshart]=-)
5


DAS HIER FUNKTIONIERT NICHT
0 Spionagesonde 0 Recycler
<!-- empty result --> *|*|*56 *|*486 *|*planet_17_small *|*22 *|*1 *|*<br><font color="#347187"><b>Kalipsos</b></font><br>(<font color="#347187">Herribert21</font>)*|*0 *|*Kalipsos*|*01:02:01 *|*<table border=0 width=100% cellpadding=1 cellspacing=0> <tr> <td width=80 class=rahmen>Besitzer</td> <td width=150 class=nachricht> <a href="#" onclick="sendMessage(25536)">Herribert21 <img src="img/email.gif?__cv=3" ...
Sonne
1
Kalipsos
(Herribert21)
2
Kolonie
(OBIWAN)
3
Kolonie
(_dominic2_)
4
Wolkenbasis SW
(Tom_1209)
5
Trantor
(Tom_1209)
6
Kolonie
(Max_Ac)
7
Omicron Lyrae
(Tom_1209)
8
rsh
(gonnus)
9
Kolonie
(Hunter2302)
10
Argon Prime
(Tom_1209)
11...

beim 2. erkennt er die daten nicht
habt ihr ne idee warum?

auch hier nochmal, dickes dankeschön für eure Hilfe ;)

defabricator
09.01.2008, 00:34:46
Hm, mit dem Text bekomme ich die AusgabeArray
(
[0] => Array
(
[1] => Array
(
[name] => Hades 3
[besitzer] => deadaluss
)

[2] => Array
(
[name] => Companie Alpha
[besitzer] => cousinhoub
)

[3] => Array
(
[name] => Hades 4
[besitzer] => deadaluss
)

[4] => Array
(
[name] => Dune
[besitzer] => -=[Bosshart]=-
)

)

[1] => Array
(
[1] => Array
(
[name] => Kalipsos
[besitzer] => Herribert21
)

[2] => Array
(
[name] => Kolonie
[besitzer] => OBIWAN
)

[3] => Array
(
[name] => Kolonie
[besitzer] => _dominic2_
)

[4] => Array
(
[name] => Wolkenbasis SW
[besitzer] => Tom_1209
)

[5] => Array
(
[name] => Trantor
[besitzer] => Tom_1209
)

[6] => Array
(
[name] => Kolonie
[besitzer] => Max_Ac
)

[7] => Array
(
[name] => Omicron Lyrae
[besitzer] => Tom_1209
)

[8] => Array
(
[name] => rsh
[besitzer] => gonnus
)

[9] => Array
(
[name] => Kolonie
[besitzer] => Hunter2302
)

[10] => Array
(
[name] => Argon Prime
[besitzer] => Tom_1209
)

)

)ist doch alles da?

JuliusCaesar
09.01.2008, 17:32:14
komisch, kann das an XAMPP liegen?
könnteste mir deinen code mal erklären bzw ausführlicher schreiben, vllt habe ich das auch einfach falsch ins den bisherigen code eingebunden...

defabricator
10.01.2008, 01:30:42
Der Code teilt den Text in Zeilen auf und entfernt eventuelle white spaces am Anfang und Ende. Dann geht er alle Zeilen durch.
Er suicht nach einer Zeile, in der nur "Sonne" steht. Ab da wird geprüpft, ob die aktuelle Zeile nur eine Zahl enthält und die übernächste Zeile eine ( am Anfang und eine ) am Ende hat. Wenn alles zutrifft, werden die drei Zeilen als Planet eingetragen und dann übersprungen. Wenn dieses Raster nicht mehr passt, werden alle gefunden Planeten als Sonnensytem eingetragen und die Suche nach "Sonne" geht wieder los.
Versuch es mal so$sonnensysteme = array();
$text = array_map('trim', explode("\n", $_POST['text']));
for($i=0; $i<count($text); $i++) {
if ($text[$i]==='Sonne') {
$i++;
$planeten = array();
while($i+2<count($text)) {
if (ctype_digit($text[$i]) && $text[$i+2][0]==='(' && $text[$i+2][strlen($text[$i+2])-1]===')') {
$planeten[$text[$i]] = array('name'=>$text[$i+1], 'besitzer'=>substr($text[$i+2],1, -1));
$i+=3;
}
else {
break;
}
}
$sonnensysteme[] = $planeten;
}
}
if (isset($planeten) && !empty($planeten)) {
$sonnensysteme[] = $planeten;
}
print_r($sonnensysteme);

JuliusCaesar
10.01.2008, 22:03:56
abend
beides codes funken leider net, Fehle ran derselben stelle
aber immerhin ist es mir gelungen den Fehler zu orten^^

ich benötige eine for schleife, weil der rest des codes auch auf eine for schleife aufbaut...
//text hinter jeden neuen Zeile sprengen
$exp = explode("\n", $_POST['text']);

$text = array_map('trim', $exp);

echo "<hr><pre>";
print_r($text);
echo "<hr></pre>";

for($i=0; $i<count($text); $i++)
{
//falls Sonne in Ziele steht.....
if($text[$i]==='Sonne')
{
//warum wird $i hie rnochmal extra erhöht, wird dochs chon in for schleife getan?
$i++;
$planeten = array();
while($i+2<count($text))
{
//was passiert hier?
if(ctype_digit($text[$i]) && $text[$i+2][0]==='(' && $text[$i+2][strlen($text[$i+2])-1]===')')
{
$planeten[$text[$i]] = array('name'=>$text[$i+1], 'besitzer'=>substr($text[$i+2],1, -1));
//wird $i der wert 3 zugeordnet oder $i und 1 erhöht?
$i+=3;
}
else
{
break;
}
}
$sonnensysteme[] = $planeten;
}
}


echo "<pre>";
print_r($sonnensysteme);
echo "</pre>";
}

ich wäre dankbar wenn mir jemand meine fragen im quecode auch noch beatwortet..
weil ich verstehe noch nicht so ganz was die einzellnen Funktionen bezwecken

aber nun zum Fehler:
beim ersten komtm er bis Plani 4
Sonne
1
Kolonie
(makz)
2
Pinnow
(motschi1989)
3
Kolonie
(Lafutsch[E.A.R.T.H.])
4
Lecithin
(Zinkoxid)
5
X: 53 Y: 219
6
Tunaria
(Atemu1976)
7

Planet 5 ist allerdings unbesiedelt
man müsste als vermutlich noch mit strpos prüfen ob X: und Y: in der einzellnen Zeile vorkommen
falls die vorkommen soll der plani name "unbesiedelter Planet" sein und der besitzer soll einfach leer bleiben

ich würde da sja selbe ramchen, wenn ich den teil mit
if(ctype_digit($text[$i]) && $text[$i+2][0]==='(' && $text[$i+2][strlen($text[$i+2])-1]===')')
{
$planeten[$text[$i]] = array('name'=>$text[$i+1], 'besitzer'=>substr($text[$i+2],1, -1));
//wird $i der wert 3 zugeordnet oder $i und 1 erhöht?
$i+=3;
}
verstehe würde...
(es würde mir sehr helfen wenn ihr diesen teil ausführlicher schreiben würdet, so wie ichs oben mit explode gemacht habe, arbeite halt noch nicht so lang emit php...)

defabricator
11.01.2008, 02:25:30
//warum wird $i hie rnochmal extra erhöht, wird dochs chon in for schleife getan? Wenn in Zeile i 'Sonne' steht, interessiert uns Zeile i nicht mehr. Die gesuchten Datens tehen ab Zeile i+1, deshalb i++
//was passiert hier?
ctype_digit($text[$i]) = Enthält Zeile i nur Ziffern?
Und der Rest: Beginnt Zeile i+2 mit ( und hört mit ) auf?
//wird $i der wert 3 zugeordnet oder $i und 1 erhöht? Kurzform für $i=$i+3;

So sehen also unbesiedelte Planeten aus. Interessant. Ja dann muss man da was ändern. Aber nicht mehr heute.

JuliusCaesar
12.01.2008, 19:47:27
ok ich glaube so langsam blicke ich durch
ich habe deinen code mal "auseinandergeplückt", auf diese weise erscheint er für mich übersichtlicher

nun habe ich folgendes probiert
$sonnensysteme = array();

//text hinter jeden neuen Zeile sprengen
$exp = explode("\n", $_POST['text']);

$text = array_map('trim', $exp);


for($i=0; $i<count($text); $i++)
{
//falls Sonne in Ziele steht.....
if($text[$i]==='Sonne')
{
//Wenn in Zeile i 'Sonne' steht, interessiert uns Zeile i nicht mehr. Die gesuchten Daten stehen ab Zeile i+1, deshalb i++
$i++;
$planeten = array();
while($i+2<count($text))
{
$length = strlen($text[$i+2]);
//wo wird plani position definiert
if(ctype_digit($text[$i]))
{
//fals plani besidelt
if($text[$i+2][0]==='(' and $text[$i+2][$length-1]===')')
{
$u_name = substr($text[$i+2],1, -1);
//Beginnt Zeile i+2 mit ( und hört mit ) auf?

$planeten[$test[$i]]['name'] = $text[$i+1];
$planeten[$text[$i]]['besitzer'] = $text[$i+1]['besitzer'] = $u_name;
//$planeten[$text[$i]] = array('name'=>$text[$i+1], 'besitzer'=>$u_name);
$i = $i + 3;
}
//fals plani unbesiedelt
elseif(strpos('X:', $text[$i+1]) and strpos('Y:' ,$text[$i+1]))
{
$planeten[$test[$i]]['name'] = 'unbesiedelt';
$planeten[$text[$i]]['besitzer'] = 'kein Besitzer';
}
else
{
echo "";
}
}
else
{
break;
}
}
$sonnensysteme[] = $planeten;
}
}

das für ABer zu einer Zeitüberschreitung
habe ich unbeabsichtigt ne Endlosschleife gemacht?

defabricator
13.01.2008, 02:54:22
Ja, hast Du.
In meiner Version passiert folgendes (wenn x und y und z, dann i+=3, sonst Ende).
Du hast das jetzt aufgeteilt und damit ist (i+=3 oder Ende) nicht mehr überall gewährleistet.

JuliusCaesar
13.01.2008, 16:46:40
ok ich habe jetzt mal das $i= $i+3 am ende der while schleife eingefügt

<?php
$sonnensysteme = array();

//text hinter jeden neuen Zeile sprengen
$exp = explode("\n", $_POST['text']);

$text = array_map('trim', $exp);


for($i=0; $i<count($text); $i++)
{
//falls Sonne in Ziele steht.....
if($text[$i]==='Sonne')
{
//Wenn in Zeile i 'Sonne' steht, interessiert uns Zeile i nicht mehr. Die gesuchten Daten stehen ab Zeile i+1, deshalb i++
$i++;
$planeten = array();

while($i+2<count($text))
{
$length = strlen($text[$i+2]);
//wo wird plani position definiert
if(ctype_digit($text[$i]))
{
//fals plani besidelt
if($text[$i+2][0]==='(' and $text[$i+2][$length-1]===')')
{
//besitzer name auslesen, leerzeichen am anfang mit substr entfernen
$u_name = substr($text[$i+2],1, -1);

$planeten[$test[$i]]['planet_name'] = $text[$i+1];
$planeten[$text[$i]]['user_name'] = $u_name;
//$planeten[$text[$i]] = array('name'=>$text[$i+1], 'besitzer'=>$u_name);
}
//falls plani unbesiedelt
elseif(strpos('X:', $text[$i+2]) and strpos('Y:' ,$text[$i+2]))
{
$planeten[$test[$i]]['planet_name'] = 'unbesiedelt';
$planeten[$text[$i]]['user_name'] = 'kein Besitzer';
}
else
{
echo "";
}
echo "<pre><hr>{$text[$i+1]}<hr></pre>";
$i = $i + 3;
}
else
{
break;
}
}
$sonnensysteme[] = $planeten;
}
}


echo "<pre>";
print_r($planeten);
echo "</pre>";
?>

das script läuft jetzt nicht mehr unendlich lange, das sist schonmal etwas
allerdings erkennt er jetzt nur noch den 1. plani namen, die user namen sind alel vollständig
woran liegt das.

$text sieht so aus
Array
(
[0] =>
[1] => Sonne
[2] => 1
[3] => Halipsos
[4] => (Herribert21)
[5] => 2
[6] => Oolonie
[7] => (OBI~*\\«š»/*~WAN)
[8] => 3
[9] => _olonie
[10] => (_dominic2_)
[11] => 4

aber $planeten nur so
Array
(
[] => Array
(
[planet_name] => Blackworld
)

[1] => Array
(
[user_name] => Herribert21
)

[2] => Array
(
[user_name] => OBI~*\\«š»/*~WAN
)

[3] => Array
(
[user_name] => _dominic2_
)
obwohl er doch immer in der zeile $i+1 den plani namen auslesen soll und in der zeile $i+2 den spielernamen

edit:ich habs nm geprüft
$text[$i+1] enthält alle plani namen
aber wieso werde die Planeten namen nicht an
$planeten[$test[$i]]['planet_name'] übergeben
laut
$planeten[$test[$i]]['planet_name'] = $text[$i+1];
müsste das doch passieren

JuliusCaesar
14.01.2008, 18:53:44
ok,hab das oben beschriebene Probleme selbst gelöst
,hatte mich nur 1 mal bei den varibalen verschreiben:
aber es stellt sich noch ein Prob jetzt :Oo
er gibt imemr nur die Werte vom letzten eingelesenen Sonnensystem aus, die andern werden irgendwie überschreiben, obwohl ich nocdh einen extra key eingefügt habe

script link (http://juliuscaesar.kilu2.de/test.phps)

PS: kann verstehen, wenn ihr mir überdrüssig seid, wenn ich das script fertig habe, werde ich euch wieder in ruhe lassen^^

lg Julius

walmanar
21.01.2008, 19:32:37
Im Gegensatz zu C oder anderen Programmiersprachen (PHP ist keine!)Aha.