· 17.01.2006 · 18:20:41 ·String zerlegen: strtok vs. explode
Textdateien als Datenbank nutzen, z.B. für Config Informationen.
Durch zerlegen des Strings in der Textdatei, erhält man die einzelnen Daten der Datenbank. Als C Programmierer nutzte ich dafür
strtok
$datenbank="Info 1#Info 2#nochmehr Info";
$tok=strtok($datenbank,"#");
while( $tok )
{
echo("\n<br>$tok");
$tok=strtok("#");
}
Ergebniss:
Info 1
Info 2
nochmehr Info
Beim ersten Aufruf von strtok übergibt man den zu zerlegenden String und den Delemiter (Delemiter = Trennzeichen)
Beim zweiten Aufruf nur noch den Delemiter, den zu zerlegenden String hat sich die Funktion gemerkt.
Dieses "merken" ist ein Problem. Denn dadurch ist es nicht möglich in einer Schleife (while/for) in welcher ein String zerhackt wird, einen weiteren String zu zerhaken.
geht nicht
$str1 = "Info 1#Info 2#nochmehr Info";
$str2 = "zusatz=zusatz2,nochmehrZusatz";
$zusatzinfo="Info 2";
$tok=strtok($str1,"#");
while( $tok )
{
echo("\n<br>$tok");
if ( $tok==$zusatzinfo )
{
$tok2=strtok($str2,"=");
while( $tok2 )
{
echo("\n<br>=$tok2");
$tok2=strtok(",");
}
}
$tok=strtok("#");
}
Hier wird der "gemerkte" $str1 durch $str2 überschreiben, bzw das Zerlegen neu gestartet ...
besser explode
$str1 = "Info 1#Info 2#nochmehr Info";
$tok=explode("#",$str1);
$i=-1;$x=count($tok);
while( ++$i < $x )
{
echo("\n<br>$tok[$i]");
}
Anmerkung:
Bei strtok gibt es ein zusätzliches Problem.
$str1 = "Info 1#Info 2##nochmehr Info";
Hier wären in $str1 nur 3 Teile, da nach "Info 2" ein leeres Teilstück kommt, wird gleich das übernächste geliefert.
Deswegen muß man immer darauf achten das mindesten 1 Zeichen im zwischen den Delemitern steht.
$str1 = " Info 1 # Info 2 # # nochmehr Info ";
Jetzt hat man aber zusätzliche SpaceZeichen die man nach dem auslesen eventuell nicht haben möchte. Dafür gibt es den Befehl
trim welcher Leerzeichen und Returnzeichen entfernt.
$string 1 mit Returnzeichen:
$str1 = "\nInfo 1#\nInfo 2\n#\n#\nnochmehr Info";
$tok=strtok($str1,"#");
while( $tok )
{
echo("\n<br>=$tok");
$tok=strtok("#");
}
Ergebniss:
=Info 1
=Info 2
=
=nochmehr Info
Am Platz 3 war ja ein Leerfeld.