PHP/Formatierfunktionen

Aus Mikiwiki
< PHP
Wechseln zu: Navigation, Suche

Universelle Zeichenkettenformatierungen

Daten müssen häufig vor der Ausgabe im Webbrowser formatiert werden. Dazu stehen die Funktionen "printf" und "sprintf" zur Verfügung: "sprintf" gibt das Ergebnis an eine Zeichenkette zurück, "printf" sendet es dagegen direkt an den Zeichenausgabepuffer. Wenn PHP im Webserver arbeitet, erfolgt die Ausgabe über die CGI-Schnittstelle zum Webbrowser. Die Funktionen "vprintf" und "svprintf" unterscheiden sich von zuerst erwähnten nur dadurch, dass die Übergabe der Werte nicht als Liste von Parametern, sondern in Form eines Arrays möglich ist. Die Funktionen "printf" und "sprintf" sind in der Anwendung identisch, die folgende Beschreibung bezieht sich deshalb nur auf "sprintf".

Die Funktion "sprintf" hat mindestens zwei Parameter. Der erste gibt eine Formatieranweisung an, der zweite (und alle folgenden) gibt einen Wert an, der in die Formatieranweisung eingesetzt wird. Eine vollständige Formatieranweisung besteht aus fünf Elementen:

  1. Ein Füllzeichen: Der Standardwert ist das Leerzeichen. Sind mehrere Stellen gewünscht und der Zahlen- oder Zeichenkettenwert erreicht diese nicht, so wird der Rest mit dem Füllzeichen aufgefüllt.
  2. Ausrichtung: Standardmässig werden alle Werte rechts ausgerichtet, die Füllzeichen werden also als führende Zeichen behandelt. Mit einem Minuszeichen ("-") wird dieses Verhalten umgedreht.
  3. Zeichenzahl: Eine optionale Zahl Zeichen, die für den Wert in der Ausgabe reserviert wird. Fehlende Zeichen werden mit Füllzeichen aufgefüllt.
  4. Dezimale: Für Gleitkommazahlen kann die Anzahl der Dezimalstellen bestimmt werden. Auf andere Werte hat dies keinen Einfluss.
  5. Typ: Der Typ gibt an, wie der Wert allgemein behandelt wird. Folgende Typen sind möglich:
Typcode Bedeutung Darstellung
% Ausgabe eines Prozentzeichens.
b Ganze Zahl (Integer) Binäre Form
c Ganze Zahl (Integer) Zeichen aus dem ASCII-Zeichensatz
d Ganze Zahl (Integer) Dezimalzahl
f Gleitkommazahl Exponentialform
o Ganze Zahl (Integer) Oktale Form
s Zeichenkette, kann links oder rechts ausgerichtet werden
x Ganze Zahl (Integer) Hexadezimale Form (als Kleinbuchstaben "a" bis "f").
X Ganze Zahl (Integer) Hexadezimale Form (als Grossbuchstaben "A" bis "F").

Ein Beispiel.

$ergebnis = sprintf("%04d-%02d-%02d", $jahr, $monat, $tag);

Neben der direkten Angabe der Formate, welche die Auflistung der Fomrate genau in der Reihenfolge erwartet, wie die Formate stehen, gibt es auch eine erweiterte Form mit direkter Adressierung. Dabei wird die Zeichenfolge "N$" zwischen "%" und Format geschoben, wobei "N" eine das Argument adressierende Zahl ist (1-basiert). Diese Form der Adressierung ist immer dann sinnvoll, wenn die Formatzeichenkette unabhängig von der Plazierung der Argumente sein soll, beispielsweise wenn sie sprachabhängig ist und aus einer anderen Quelle kommt, die der Entwickler nicht kontrollieren kann.

$ergebnis = printf("%2$s %1$4.2d", $betrag, $symbol);

In der Formatierzeichenkette können beliebige Kombinationen solcher Zeichen dargestellt werden, beispielsweise für die Ausgabe von Währungen. Alle nicht zur Formatieranweisung gehörenden Zeichen werden unverändert ausgegeben, wie im folgenden Beispiel das Präfix "SFr. ". Für die Ausgabe von führenden Nullen ist die Ausgabe ebenfalls geeignet.

<?php
$geld = 63.14;
printf("SFr. %0.2f<br />", $geld);
$integer = 34;
printf("[%04d]<br />", $integer);
$prozent = 14.45;
printf("Der Anteil beträgt %0.2f%%<br />", $prozent);
?>
SFr. 63.14
[0034]
Der Anteil beträgt 14.45%

Auch die Funktion "sscanf" verwendet dieselben Formatieranweisungen, um eine Zeichenfolge auf eine bestimmte Muster hin zu durchsuchen. Werden diese erkannt, überträgt die Funktion den entsprechenden Teil in eine Variable. Das folgende Beispiel zeigt die Aufbereitung eines US-amerikanischen Datumsformates und die Ausgabe in der in der Schweiz üblichen Form mit "sscanf" und "printf". Das von "sscanf" erzeugte Array "%d" hat dabei so viele Elemente, wie gültige Formatierungen entdeckt werden konnten. Dies muss nicht der Anzahl der Formatieranweisungen entsprechen.

<?php
$date = "2008/26/5";
$d    = sscanf($date, '%d/%d/%d');
printf("%02d.%02d.%4d", $d[1], $d[2], $d[0]);
?>
26.05.2008

Die Formatierfunktionen "printf", "sprintf" und "sscanf" verarbeiten alle eine Liste von Parametern. Bei vielen Parametern ist dies lästig, da sich die Funktion nur noch schwer darstellen lässt. Alternativ können deswegen "vprintf" und "vsprintf" eingesetzt werden, welche die Parameter als Array akzeptieren.

Die Funktion "number_format" eigent sich vor allem, um das intern verwendete englische Zahlenformat bei Bedarf in ein anderes umzuwandeln.

Die Funktion "money_format" formatiert Währungsangeben unter Berücksichtigung der durch "setlocale" vorgenommenen Einstellungen und steht nur unter Linux zur Verfügung.

Formatierungen der Ausgabe

Manchmal sind nicht die Daten selbst zu formatieren, sondern es ist nur die Position in einem grösseren Zusammenhang anzupassen. Beispielsweise müssen Werte links und rechts aufgefüllt oder eine Anzahl Füllzeichen erzeugt werden.

Die Funktion "str_pad" erweitert eine Zeichenkette links, rechts oder auf beiden Seiten mit einem oder mehreren Zeichen. Als Füllstoff kann auch eine Zeichenkette verwendet werden.

Die Funktion "str_repeat" wiederholt eine Anzahl Zeichen oder eine Zeichenkette. Die angegebene Anzahl muss grösser als 0 sein. Im folgenden Beispiel wird Text mittels Leerzeichen zentriert, was etwa in unformatierten E-Mails benötigt wird.

<?php
$max = 76;
$arr = array("Um dieses", "Skript", "zu testen,", 
             "wurden ein paar Zeilen", "in einem Array", 
             "abgelegt");
echo "<pre>";
foreach($arr as $line) 
{
   echo str_repeat(" ", $max/2-strlen($line)/2) . "$line\n";
}
echo "</pre>";
?>
                                 Um dieses
                                   Skript
                                 zu testen,
                           wurden ein paar Zeilen
                               in einem Array
                                  abgelegt

Oft wird ausgehend vom aktuellen Skript die Berechnung des Schrittes in der Verzeichnishierarchie nach oben zum Wurzelverzeichnis des Webservers benötigt. Damit kann gezielt auf andere Verzeichnisse zugegriffen werden. "$fn" kann durch einen Pfad bzw. Skriptnamen ersetzt werden, um direkt darauf zuzugreifen, gleichgültig, wo sich das aufrufende Skript befindet.

<?php
$PHP_SELF = $_SERVER['PHP_SELF'];
if (strpos($OS, "Win") > 0 ) 
{
  $slash = "\\";
}
else
{
  $slash = "/";
}
$up = str_repeat("../",substr_count($PHP_SELF,$slash)-1); 
$fn = substr(strrchr($PHP_SELF, $slash), 1);
echo "Rootpfad: $up$fn";
?>
Rootpfad: ../test.php