Vinzenz Mai: Umwandeln einer speziellen Zeichenkette in ein Zahlenarray

Beitrag lesen

Hallo Constantin,

Na, also um auch von meiner Seite das klar zu stellen, ich wollte hier niemandem irgendwie auf den Schlips treten. Schließlich kann ich PHP so gut wie nicht und "bewundere" jeden der sich damit auskennt.

die Lösung bestimmter Probleme ist in den Grundzügen unabhängig von der Programmiersprache.

Wahrscheinlich habe ich mich auch sonst etwas unvorteilhaft ausgedrückt.

Das trifft den Nagel auf den Kopf.

Ich habe eine Codezeile um Umkehren der Zahlenreihe, eine zum Ersetzen der Nullen in der Zahlenreihe und ein Script für den Graphen.

Du hast eine Vorstellung davon, wie Du die Ziffernzeichenkette, die nach dem Muster

<Tiefe in dm>0000000000<Tiefe in dm>0000000000<Tiefe in dm> ...

aufgebaut ist zu einer nutzbaren Form umwandeln willst. Du hast das Problem erkannt, dass eine Tiefe auf eine (oder mehrere Nullen) enden kann und Du daher nicht einfach eine Folge von 10 Nullen in ein Trennzeichen umwandeln kannst, weil die Umwandlung von vorn beginnt. Daher hast Du Dir das Verfahren überlegt:

  • Umkehren der Zeichenfolge
  • Ersetzen von 10 Nullen in Folge in ein Trennzeichen
  • Erneutes Umkehren der Zeichenfolge

Nun hast Du die Nutzdaten, durch ein Trennzeichen getrennt, in der Zeichenkette.

Umkehren der Zahlenreihe:
.strrev($zeichenkette);

Ersetzen der Nullen:

replace($str;"0000000000";";")

Na, so ganz richtig sind diese Funktionen nicht. Aber dazu kommen wir

[...]

Wir sehen, dass Deine Plott-Funktione ein [link:http://de3.php.net/manual/de/language.types.array.php@title=Array] haben möchte.

$datay = array(0,25,12,47,27,27,0);

[...]

// Create the line
$p1 = new LinePlot($datay);

  
Du benötigst somit eine Funktion, die eine Zeichenfolge in einem bestimmten (oben angegebenen Format) entgegennimmt, die angegebenen Umformungen vornimmt und anschließend am Trennzeichen in ein Array von Zahlen aufteilt.  
  
http://de3.php.net/manual/de/function.strrev.php hast Du bereits gefunden, vermutlich auch [str_replace()](http://de3.php.net/manual/de/function.str-replace.php). Damit kriegen wir bereits den ersten Teil hin:  
  
Gehen wir Schritt für Schritt vor, mit entsprechenden Ausgaben, um die Abarbeitung nachvollziehen zu können.  
  
~~~php
  
# für besser lesbare Debugausgaben:  
echo "<pre>\n"  
# Im Codebeispiel verwende ich die Nutzdaten 190, 208 und 22  
$originalData = '1900000000000208000000000022';  
  
# Temporärer Stand nach dem ersten Umwandeln:  
$temp = strrev($originalData);  
echo $temp, "\n";   # gibt 2200000000008020000000000091 aus  
  
# Darauf wenden wir str_replace() an. Beachte die im Handbuch angegebene  
# Reihenfolge der Parameter  
# Als Trennzeichen verwende ich, wie von Dir angegeben das Semikolon  
$temp1 = str_replace('0000000000', ';', $temp);  
echo $temp1, "\n";   # gibt 22;802;091 aus  
  
# Auf das Ergebnis dieser Operation lassen wir erneut strrev() los:  
$temp2 = strrev($temp1);  
echo $temp1, "\n";   # gibt 190;208;22 aus  

Zum Auftrennen in ein Array kannst Du die Liste der String-Funktionen durchsuchen, ob Du anhand der Beschreibung etwas passendes findest. Du wirst bei explode() fündig.

# Aufsplitten am Trennzeichen ';' mit explode() in ein Array  
$temp3 = explode(';', $temp2);  
# [link:http://de3.php.net/manual/de/function.var-dump.php@title=var_dump()] benutzen, um sich das Ergebnis anzuschauen:  
var_dump($temp3);  
  
/*  
Ausgabe:  
array(3) {  
  [0]=>  
  string(3) "190"  
  [1]=>  
  string(3) "208"  
  [2]=>  
  string(2) "22"  
*/  

Wir haben also noch Zeichenketten vor uns, die Funktion erwartet jedoch Zahlen. Wir könnten uns darauf verlassen, dass PHP die Konvertierung von selbst hinbekommt. Wir können die Konvertierung auch selbst vornehmen. Dazu wenden wir auf jedes Array-Element die gleiche Funktion an, die eine Zeichenkette in einen Integer-Wert umwandelt: intval(). Bei den Array-Funktionen finden wir array_map(), die genau das kann, was wir brauchen:

# Erzeuge ein Array mit Integer-Werten als Elemente  
$datay = array_map("intval", $temp3);  
var_dump($datay);  
  
/*  
Ausgabe:  
array(3) {  
  [0]=>  
  int(190)  
  [1]=>  
  int(208)  
  [2]=>  
  int(22)  
}  
*/

genau das, was an den Graphen verfüttert werden kann :-)
Die Zwischenschritte in den temporären Variablen werden natürlich nicht benötigt und in Deinem Fall hier können wir jedesmal den Rückgabewert des ersten Funktionsaufrufs als Parameter dem nächsten Funktionsaufruf übergeben:

Aus

# Im Codebeispiel verwende ich die Nutzdaten 190, 208 und 22  
$originalData = '1900000000000208000000000022';  
  
$temp = strrev($originalData);  
$temp1 = str_replace('0000000000', ';', $temp);  
$temp2 = strrev($temp1);  
$temp3 = explode(';', $temp2);  
$datay = array_map("intval", $temp3);  

wird somit

$originalData = '1900000000000208000000000022';  
$delimiter    = ';'    # wir brauchen den ja zweimal  
  
/* Zwischenschritte einzeln zum Nachprüfen mit echo bzw var_dump,  
   wenn Du es Dir in Einzelschritten anschauen willst.  
$temp1 = str_replace('0000000000', $delimiter, strrev($originalData));  
$temp2 = strrev(str_replace('0000000000', $delimiter, strrev($originalData)));  
$temp3 = explode($delimiter, strrev(str_replace('0000000000', $delimiter, strrev($originalData))));  
*/  
  
$datay = array_map("intval", explode($delimiter, strrev(str_replace('0000000000', $delimiter, strrev($originalData)))));  
  
/*  
Ausgabe:  
array(3) {  
  [0]=>  
  int(190)  
  [1]=>  
  int(208)  
  [2]=>  
  int(22)  
}  
*/

Selbstverständlich gibt es noch andere Wege, dieses Ziel zu erreichen. Ich habe hier den Weg gewählt, den Du vorskizziert hast und die Lücken ausgefüllt.

Die nächste Aufgabe wäre es, zu lernen, wie man einen Datensatz aus einer Tabelle einer Datenbank auslesen kann und im Ergebnis auf den Inhalt einer bestimmten Spalte zugreifen kann. Dazu empfehle ich Dir das Tutorial von Quakenet.

Freundliche Grüße

Vinzenz