# Standardfunktionen

Mit einem kurzen Schweifwedeln kann ein Hund mehr Gefühl ausdrücken als mancher Mensch mit stundenlangem Gerede.
Louis Armstrong, amerik. Jazzmusiker

Wie schon Perl stellt auch PHP eine Menge Funktionen von Haus aus zur Verfügung. Einige dieser Funktionen werden Sie häufig benötigen, andere seltener.

# Zeichenkettenfunktionen

Neben den Möglichkeiten, Zeichenketten in Groß- oder Kleinbuchstaben umzuwandeln, können Sie noch weitere Umwandlungen an Zeichenketten vornehmen, um sie HTML-gerecht ausgeben zu können.

# Groß- und Kleinschreibung

Die Funktion strtoupper wandelt eine als Parameter übergebene Zeichenkette in Großbuchstaben um. Sie gibt die umgewandelte Zeichenkette als Rückgabewert zurück.

string strtoupper(string string)

Das Gegenteil, die Umwandlung aller Zeichen in Kleinbuchstaben, übernimmt die Funktion strtolower. Auch sie gibt die umgewandelte Zeichenkette als Rückgabewert zurück.

string strtolower(string string)

Ein Beispiel:

$str = "Zeichenkette, welche auch ä's, ö's und ü's enthält<br>\n";  
echo $str;  
$str = strtoupper($str);  
echo $str;  
$str = strtolower($str);  
echo $str;

Die Ausgabe im Browser sieht folgendermaßen aus:

Zeichenkette, welche auch ä's, ö's und ü's enthält
ZEICHENKETTE, WELCHE AUCH Ä'S, Ö'S UND Ü'S ENTHÄLT
zeichenkette, welche auch ä's, ö's und ü's enthält

Wie Sie sehen können, haben die Funktionen nur auf Buchstaben Auswirkungen und nicht auf alle Zeichen. Beachten Sie auch immer, dass die originale Zeichenkette nicht verändert wird. Erst wenn Sie den Rückgabewert wieder der als Parameter übergebenen Variablen zuweisen, wird sie verändert.

# Zeichenwerte

Ich bin schon häufiger in diesem Buch auf den Begriff »ASCII-Code« zu sprechen gekommen. Jedes druckbare Zeichen besitzt einen eigenen Code in der so genannten ASCII-Tabelle. Dadurch lässt sich aus einer gegebenen Zahl das entsprechende Zeichen ermitteln – und umgekehrt. In PHP stehen dafür die Funktionen chr und ord bereit. Die Funktion chr ermittelt den ASCII-Code eines Zeichens, und die Funktion ord ermittelt das Zeichen eines ASCII-Codes.

string chr(int ascii);  
int ord(string char)

Ein Beispiel:

$code = ord("ö");  
$zeichen = chr(255);

Leider funktioniert dies in Zusammenhang mit einer HTML-Ausgabe nicht korrekt. Die Funktionen sollten also eher verwendet werden, wenn Sie schreibend oder lesend auf eine Datei zugreifen möchten.

# Länge einer Zeichenkette

Die Länge einer Zeichenkette bzw. eines Strings können Sie mit der Funktion strlen ermitteln. Die Zeichenkette, deren Länge ermittelt werden soll, wird als Parameter übergeben, und die Funktion gibt dann die Anzahl an Zeichen zurück.

int strlen(string string)

Das folgende Beispiel ermittelt die Länge einer Zeichenkette und gibt jedes Zeichen in einer neuen Zeile aus:

$str = "Eine Zeichenkette";  
$laenge = strlen($str);  
for($i=0; $i<$laenge; $i++)  
{  
  echo "$str[$i]<br>\n";  
}

Die Länge der Zeichenkette wird in der for-Schleife verwendet, um die Abbruchbedingung zu definieren. Zusätzlich kann über einen Index ein bestimmtes Zeichen einer Zeichenkette ausgegeben werden. Dafür muss lediglich die Position des Zeichens in eckigen Klammern notiert werden.

$string[Index]

Beachten Sie, dass die Zählung bei 0 beginnt, das erste Zeichen hat also den Index 0, das zweite den Index 1 usw. Sie können Strings also prinzipiell »ein Array aus mehreren einzelnen Zeichen« nennen.

# Teilzeichenkette suchen

Mit der Funktion strpos können Sie nach einem Zeichen oder einer Zeichenkette in einer anderen Zeichenkette suchen.

int strpos(string haystack, string needle [, int offset])

Die Zeichenkette, in der gesucht werden soll, ist haystack (dt. Heuhaufen) und das Zeichen bzw. die Zeichenkette, nach der gesucht werden soll, ist needle (dt. Nadel). Optional können Sie noch eine Startposition übergeben, ab der gesucht werden soll.

Im folgenden Beispiel wird das Vorkommen aller X in einer Zeichenkette gezählt.

<?php

  $haystack = "AXHXLXFRXNXF";
  $xpos = 0;
  $xanz = 0;
  
  while(strpos($haystack,"X",$xpos) > -1)
  {
    $xpos = strpos($haystack,"X",$xpos);
    $anz++;
    $xpos++;
  }
  
  echo $anz;

?>

Listing 5.1: Verwendung von strpos, um zu zählen, wie oft ein bestimmtes Zeichen in einer Zeichenkette vorkommt

In Listing 5.1 wird die Funktion strpos mit einer optionalen Startposition verwendet. Damit das Vorkommen des ersten X nicht immer wieder gefunden wird und sich das Programm in einer Endlosschleife verfängt, muss die Position am Ende des Anweisungsblocks der while-Schleife um 1 inkrementiert werden.

Das Ergebnis aus Listing 5.1 ist übrigens 5.

Alternativ hätten Sie auch die Funktion substr_count verwenden können. Die Funktion gibt die Häufigkeit des Vorkommens der Teilzeichenkette zurück.

int substr_count(string haystack, string needle)

Für das vorherige Beispiel könnte der neue Quellcode folgendermaßen lauten:

$haystack = "AXHXLXFRXNXF";  
$anz = substr_count($haystack,"X");  
echo $anz;

# Teilzeichenkette auslesen

Mit der Funktion substr können Sie einen Teil einer Zeichenkette auslesen. Als Parameter müssen dabei die Quellzeichenkette, die Startposition und optional die Länge der auszulesenden Teilzeichenkette übergeben werden.

string substr(string string, int start [, int length])

Wenn Sie keine Länge angeben, wird eine Zeichenkette zurückgegeben, die dem Teil der Zeichenkette von der Startposition bis zum Ende der Quellzeichenkette entspricht.

$str = "1234567890";  
$teil1 = substr($str,5);  
echo $teil1;  
$teil2 = substr($str,3,4);  
echo $teil2;

Die Ausgabe dieses Beispiels lautet:

67890
4567

# Teilzeichenkette ersetzen

Mit der Funktion substr_replace können Sie eine Teilzeichenkette durch eine andere ersetzen.

string substr_replace(string string, string replacement, int start [, int length])

Als erster Parameter wird die Quellzeichenkette angegeben und als zweiter Parameter die Zeichenkette, die eingesetzt werden soll. Welche Zeichenkette ersetzt wird, hängt vom dritten und vierten Parameter ab. Geben Sie nur die Startposition an, wird eine Zeichenkette von der angegebenen Startposition bis zum Ende der Zeichenkette ersetzt; bei Angabe des vierten optionalen Parameters wird nur die tatsächlich angegebene Anzahl an Zeichen ersetzt.

Als Rückgabewert liefert die Funktion die veränderte Zeichenkette.

$str = "Eine Zeichenkette";  
echo substr_replace($str," String",3);

Die Ausgabe lautet:

Ein String

Mit Angabe einer Länge sieht die Funktion so aus:

$str = "Eine Zeichenkette";  
echo substr_replace($str,"Diese",0,4);

Die Ausgabe lautet:

Diese Zeichenkette

# Zeichenkette verschlüsseln

Die Funktion crypt aus Perl existiert auch in PHP. Die Funktion erwartet einen, optional zwei Parameter.

string crypt(string soup, string salt)

Diese Funktion wird häufig verwendet, um einen Benutzernamen und ein Passwort zu verschlüsseln.

$soup = "benutzer";  
$salt = "passwort";  
$crypted = crypt($soup,$salt);  
echo $crypted;

Die Ausgabe lautet:

paZ9xsy2hvUlw

Bei der Verschlüsselung sind jedoch noch ein paar Dinge zu beachten. Standardmäßig wird die Methode DES zum Verschlüsseln der Strings benutzt. Da verschiedene Betriebssysteme unterschiedliche und auch mehrere Verschlüsselungsverfahren anbieten, kann es vorkommen, dass die MD5-Verschlüsselung verwendet wird. Wichtig ist dies, wenn Sie den Parameter salt nicht übergeben. PHP wählt dann die standardmäßig eingestellte Verschlüsselung und erzeugt einen entsprechenden Zufallsschlüssel zum Kodieren.

Der verschlüsselte String kann im Übrigen nicht entschlüsselt werden, da sowohl DES als auch MD5 Einweg-Verschlüsselungen sind.

# Array-Funktionen

Bei der Verwendung von Arrays gibt es einige Funktionen, die äußerst hilfreich sein können.

# Größe eines Arrays

Mit der Funktion count können Sie die Elemente eines Arrays zählen. Als Parameter erwartet die Funktion ein Array und liefert die Anzahl der Elemente zurück.

int count(mixed var)

Zwar können Sie diese Funktion auch auf andere Variablentypen anwenden, da diese aber immer nur ein Element enthalten, wird immer 1 zurückgegeben – außer bei NULL, dort lautet der Rückgabewert 0.

$arr = Array(1,2,3,4,5,6,7,8,9,0);  
echo count($arr);

Dieses Beispiel gibt im Browser 10 aus, da $arr 10 Elemente enthält.

Alternativ können Sie auch die Funktion sizeof verwenden. Sie ist aber lediglich ein Alias für count. Gedacht ist sie für Umsteiger von anderen Sprachen, wie etwa C++.

# Arrays sortieren

Die Funktion sort sortiert die Elemente eines Arrays entweder nach der Standardmethode oder nach der Methode, die Sie angegeben haben.

void sort(array array[, int sort_flag])2 

Für sort_flag können Sie einen der folgenden Werte einsetzen:

  • SORT_REGULAR – normale Sortierung (Standard)
  • SORT_NUMERIC – numerische Sortierung
  • SORT_STRING – alphanumerische Sortierung

Das folgende Beispiel sortiert ein Array nach allen drei Methoden und gibt das jeweilige Ergebnis aus.

<?php

  $arr = Array(123,"Zehn",56,"55bcd","@");
  
  sort($arr);        // Methode = SORT_REGULAR
  echo "<h3>Normal</h3>";
  foreach($arr as $value)
  {
    echo "$value<br>\n";
  }

  sort($arr, SORT_NUMERIC);
  echo "<h3>Numerisch</h3>";
  foreach($arr as $value)
  {
    echo "$value<br>\n";
  }

  sort($arr, SORT_STRING);
  echo "<h3>Alphanumerisch</h3>";
  foreach($arr as $value)
  {
    echo "$value<br>\n";
  }

?>

Listing 5.2: Verschiedene Sortiermethoden für Arrays

Das Listing 5.2 erzeugt nun folgende Ausgabe:

Normal

55bcd
@
Zehn
56
123

Numerisch

@
Zehn
55bcd
56
123

Alphanumerisch

123
55bcd
56
@
Zehn

Wie Sie sehen können, unterscheiden sich die Sortiermethoden sehr stark voneinander, beispielsweise sortiert die numerische Methode Zahlen nach ihrem Wert und nicht nach der Schreibweise, wohingegen die alphanumerische Methode entsprechend dem Zeichen sortiert.

Um eine absteigende Sortierreihenfolge zu erhalten, müssen Sie stattdessen die Funktion rsort verwenden. Die Syntax entspricht dabei derjenigen von sort.

# Array mit Wertebereich

Manchmal ist es hilfreich, ein Array mit den Buchstaben von a bis z oder mit Zahlen von 0 bis 255 zu haben. Während dies in Perl einfach mit zwei Punkten zu realisieren ist, müssen Sie in PHP die Funktion range verwenden.

array range(mixed start, mixed end)

Einige Beispiele:

$ascii = range(0,255);  
  // Array mit 256 Elementen, Werte von 0 bis 255  
$klein = range('a','z');  
  // Array mit 26 Elementen, Kleinbuchstaben von a bis z  
$rklein = range('z','a');  
  // Array mit 26 Elementen, Kleinbuchstaben von z bis a

Sie können range aber auch direkt in einer foreach-Schleife anwenden:

foreach(range('a','f') as $char)  
{  
  echo "$char<br>\n";  
}

Die Ausgabe lautet:

a
b
c
d
e
f

# Element am Ende hinzufügen oder löschen

Bei der Verwendung von Arrays ist häufig das Hinzufügen von Elementen nötig. Die einfachste Methode, um ein Element an ein Array anzuhängen, wäre:

$arr[] = "Neues Element";

Wenn Sie nun aber mehrere Elemente hinzufügen möchten, z. B. zwei Arrays zusammenführen, müssen Sie eine Schleife verwenden, die über die Elemente des hinzuzufügenden Arrays traversiert und sie dem anderen Array dann nacheinander anhängt.

Einfacher und eleganter ist die Verwendung der Funktion array_push und array_pop. Mit diesen beiden Funktionen können Sie ein oder mehrere Elemente am Ende eines Arrays hinzufügen oder löschen. Das Hinzufügen ermöglicht die Funktion array_push, die als ersten Parameter das Zielarray erwartet und anschließend die neuen Elemente entweder einzeln oder als Array. Der Rückgabewert enthält die neue Anzahl von Elementen des Arrays.

int array_push(array destination, mixed var [,mixed ...])

Die Funktion array_pop liefert immer das letzte Element eines Arrays zurück und löscht dieses. Wenn das Array keine Elemente mehr enthält, gibt array_pop NULL zurück.

mixed array_pop(array source)

Das folgende Beispiel arbeitet sowohl mit der Funktion array_push als auch mit array_pop.

$staedte = Array("Berlin","Madrid","Hamburg");  
array_push($staedte,"Mailand","Paris");  
while($stadt = array_pop($staedte))
{  
  echo "$stadt<br>\n";
}

Zu Beginn wird ein Array namens $staedte definiert, das drei Elemente enthält. Anschließend werden zwei weitere Elemente hinzugefügt. In der while-Schleife wird so lange die Funktion array_pop ausgeführt, bis das Array $staedte keine Elemente mehr enthält.

# Elemente am Anfang hinzufügen oder löschen

Die beiden Funktionen array_shift und array_unshift ermöglichen das Hinzufügen oder Löschen eines Elements am Anfang eines Arrays.

Die Funktion array_unshift fügt ein oder mehrere Elemente am Anfang des Arrays hinzu. Die Reihenfolge, in der die Elemente an die Funktion übergeben wurden, entspricht auch der Reihenfolge, in der sie dem Array hinzugefügt wurden. Die Indizes werden entsprechend angepasst, so dass das erste Element den Index 0, das zweite den Index 1 usw. erhält. Als Rückgabewert erhalten Sie die neue Anzahl von Elementen des Arrays.

int array_unshift(array array, mixed var [,mixed ...])

Die Funktion array_shift hingegen liefert das erste Element eines Arrays zurück und löscht es anschließend. Die Indizes werden dabei auch wieder so angepasst, dass die Zählung mit 0 beginnt. Enthält das Array keine Elemente mehr, lautet der Rückgabewert NULL.

$staedte = Array("Berlin","Madrid","Hamburg");  
array_unshift($staedte,"Mailand","Paris");  
while($stadt = array_shift($staedte))
{  
  echo "$stadt<br>\n";
}

Vom vorherigen Beispiel unterscheidet sich dieses kaum. Lediglich die Funktionen, um das Array $staedte zu manipulieren, sind unterschiedlich. Es gibt jedoch einen Unterschied in der Ausgabe. Während das Beispiel aus Abschnitt 43.2.4 die Elemente von hinten ausgibt, liefert dieses Beispiel die Elemente von vorn.

# Array durchsuchen

Um ein Array auf die gleiche Weise durchsuchen zu können wie Strings mit der Funktion strpos, müssen Sie die Funktion array_search verwenden.

mixed array_search(mixed needle, array haystack)

Als needle müssen Sie den Wert notieren, nach dem gesucht werden soll, und als haystack das Array, das durchsucht werden soll. Wurde der Wert gefunden, gibt die Funktion den Index zurück, andernfalls lautet das Ergebnis FALSE.

$staedte = Array("Berlin","Madrid","Hamburg");  
$ergebnis = array_search("erl",$staedte);  
echo $staedte[$ergebnis];

Dieses Beispiel gibt im Browser Berlin aus.

# Schlüssel und Werte

Mit den beiden Sprachkonstrukten each und list können Sie die Elemente eines Arrays in Schlüssel und Wert unterteilen und einzelnen Variablen zuweisen. Beide Sprachkonstrukte stammen noch aus den Zeiten von PHP 3, existieren aber in PHP 4 noch immer und parallel zur foreach-Schleife.

Das Konstrukt each unterteilt ein Element eines Arrays in Schlüssel und Wert. Das Ergebnis dieses Konstrukts ist wiederum ein Array mit zwei Elementen. Die Konstrukt list weist die einzelnen Elemente eines Arrays Variablen zu.

$hauptstaedte = Array(Deutschland=>"Berlin",  
                      Spanien=>"Madrid",  
                      Frankreich=>"Paris");  
$hauptstadt = each($hauptstaedte);  
echo $hauptstadt[0];  
echo $hauptstadt[1];

Die Ausgabe dieses Beispiels würde Deutschland Berlin lauten. Da each jedoch immer das nächste Element zurückgibt, ist das Konstrukt geradezu dafür prädestiniert, in einer Schleife verwendet zu werden.

list($land, $stadt) = each($hauptstaedte);

Hier werden die einzelnen Elemente des durch each extrahierten Arrays an die Variablen $land und $stadt verteilt.

$hauptstaedte = Array(Deutschland=>"Berlin",  
                      Spanien=>"Madrid",  
                      Frankreich=>"Paris");  
while(list($land, $stadt) = each($hauptstaedte))  
{  
  echo "$land => $stadt<br>\n";  
}

Dieses Beispiel entspricht dem Wesen nach dem Folgenden:

$hauptstaedte = Array(Deutschland=>"Berlin",  
                      Spanien=>"Madrid",  
                      Frankreich=>"Paris");  
foreach($hauptstaedte as $land=>$stadt)  
{  
  echo "$land => $stadt<br>\n";  
}

# Datums- und Zeitfunktionen

Aufgrund der Abstammung von PHP werden Ihnen die nachfolgenden Funktionen sicherlich bekannt vorkommen.

# Der aktuelle Zeitpunkt

Auch in PHP werden Datums- und Zeitangaben im UNIX-Format vorgenommen, d. h., beim Aufruf der Funktion time erhalten Sie die seit dem 1.1.1970 verstrichene Anzahl von Sekunden. Im Übrigen liefert time den jetzigen aktuellen Zeitpunkt.

int time(void)

Da mit einer solchen Angabe in Sekunden meist sehr wenig anzufangen ist, wird die Funktion localtime verwendet, um den UNIX-Zeitstempel umzuwandeln;

array localtime(int timestamp [,bool associative])

Der erste Parameter timestamp ist der UNIX-Zeitstempel, den die Funktion erwartet. Der Parameter associative hingegen bestimmt, ob das Ergebnis ein assoziatives Array ist. Notieren Sie entweder TRUE, wenn Sie ein assoziatives Array brauchen, oder FALSE, wenn Sie ein numerisches Array erhalten möchten.

$now = localtime(time(),TRUE);  
echo $now['tm_mday'];

Die einzelnen assoziativen Indizes im Überblick:

Index Erklärung
tm_sec Sekunden
tm_min Minuten
tm_hour Stunde
tm_mday Tag des Monats
tm_mon Monat
tm_year Jahr
tm_wday Tag der Woche
tm_yday Tag des Jahres
tm_isdst Ist das Datum in Sommerzeit?

Tabelle 5.1: Schlüssel des aus dem Aufruf von localtime resultierenden Arrays

Wie üblich gilt es bei den Werten jedoch ein paar kleinere Hindernisse aus dem Weg zu räumen. Die Monatszahl aus tm_mon ist eine Zahl zwischen 0 und 11, wobei 0 dem Januar und 11 dem Dezember entspricht. Das Jahr hingegen ist eine zweistellige Zahl. So entspricht das Jahr 1999 der Zahl 99 und das Jahr 2002 der Zahl 102. Sie müssen zu diesem Wert also immer 1900 hinzuaddieren, um die korrekte Jahreszahl zu erhalten. Bei dem Tag der Woche verhält es sich wie bei dem Monat, auch hier beginnt die Zählung bei 0, wobei 0 dem Sonntag, 1 dem Monat und 6 dem Samstag entspricht.

<?php

  $monate = Array("Januar","Februar","M�rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
  $wochentage = Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
  $jetzt = localtime(time(),TRUE);
  
  $jetzt['tm_year'] += 1900;
  $monat = $jetzt['tm_mon'];
  $wochentag = $jetzt['tm_wday'];
  
  echo "$wochentage[$wochentag], der $jetzt[tm_mday]. $monate[$monat] $jetzt[tm_year]<br>";
  
?>

Listing 5.3: Ausgabe des Datums mit der Funktion localtime

Auch die Uhrzeit muss ein wenig umgestaltet werden, damit bei Werten kleiner als 10 bei den Stunden, Minuten und Sekunden eine führende 0 dargestellt wird.

$stunde = ($jetzt[tm_hour]<10) ? "0".$jetzt[tm_hour] :   
           $jetzt[tm_hour];  
$minuten = ($jetzt[tm_min]<10) ? "0".$jetzt[tm_min] : $jetzt[tm_min];  
$sekunden = ($jetzt[tm_sec]<10) ? "0".$jetzt[tm_sec] :   
             $jetzt[tm_sec];  
echo "$stunde:$minuten:$sekunden";

# Ausgabe formatieren

Einfacher ist die Verwendung der Funktion strftime. Diese Funktion erwartet zwei Parameter: als ersten den String, der die Ausgabeformatierung enthält, und als optionalen zweiten Parameter einen UNIX-Zeitstempel. Wenn Sie den Zeitstempel nicht angeben, verwendet die Funktion den Zeitstempel, der dem aktuellen Zeitpunkt entspricht.

string strftime(string format [, int timestamp])

Die Tabelle 5.2 enthält alle Platzhalter, die zur Formatierung der Ausgabe verwendet werden können. Einige von diesen Platzhaltern könnten in Windows-Umgebungen jedoch nicht bekannt sein.

Platzhalter Erklärung
%a Abgekürzter Name des Wochentags
%A Ausgeschriebener Name des Wochentags
%b Abgekürzter Name des Monats
%B Ausgeschriebener Name des Monats
%c Bevorzugte Datums- und Zeitangabe
%C Jahrhundert (0099)
%d Tag des Monats als Zahl
%H Stunde als Zahl im 24-Stunden-Format von 00 bis 23
%I Stunde als Zahl im 12-Stunden-Format von 01 bis 12
%j Tag des Jahres als Zahl von 001 bis 366
%m Monat als Zahl von 01 bis 12
%M Minute als Dezimalwert von 00 bis 59
%n Neue Zeile
%p Entweder am oder pm bei Verwendung des 12-Stunden-Formats
%S Sekunden als Dezimalwert von 00 bis 59
%t Tabulator
%u Tag der Woche als Zahl
%V Kalenderwoche als Zahl von 01 bis 53
%y Zweistellige Jahreszahl von 00 bis 99
%Y Vierstellige Jahreszahl
%Z Zeitzone, Name oder Abkürzung
%% Prozentzeichen

Tabelle 5.2: Platzhalter für die Formatierung des Datums und der Zeit mit strftime

Ein paar Beispiele für die Verwendung von Platzhaltern:

echo strftime("%A, der %d. %B %Y");  
echo strftime("%d.%m.%Y / %H:%M:%S");  
echo strftime("Wir schreiben das %C. Jahrhundert");

# Datum umwandeln

Die Funktion mktime ermöglicht die Umwandlung eines Datums in einen UNIX-Zeitstempel. Die Werte werden jedoch einzeln an die Funktion übergeben.

int mktime(int hour, int minute, int second, int month, int day, int year)

Der Rückgabewert dieser Funktion ist dann der UNIX-Zeitstempel. Die Umwandlung des Datums 5.11.1980 um 02:00:05 Uhr würde dann folgendermaßen aussehen:

$unixtime = mktime(2,0,5,11,5,1980);  
echo strftime("Der %d.%m.%Y war ein %A",$unixtime);

Die Ausgabe lautet:

Der 05.11.1980 war ein Mittwoch

# Mathematische Funktionen

Berechnungen werden nicht so häufig verwendet wie die zuvor dargestellten Funktionen, werden aber doch gelegentlich benötigt, etwa für einen Zufallsgenerator oder Ähnliches.

# Zufallsgenerator

Der Zufallsgenerator in PHP funktioniert ähnlich wie in Perl, und auch die Namen der Funktionen entsprechen sich. Die Initialisierung des Zufallsgenerators mit der Funktion srand wird auch in Perl vorgenommen.

void srand(int seed)

Da die Initialisierung des Zufallsgenerators mit immer der gleichen Zahl die gleiche Zufallszahlensequenz erzeugt, sollten Sie als Parameter an die Funktion srand den aktuellen Zeitpunkt übergeben, z. B. mit:

srand((double)microtime()*time());

Die Zufallszahlen selbst erzeugen Sie mit Hilfe der Funktion rand:

int rand([int min [, int max]])

Die Angabe eines Wertebereichs ist optional. Mit ihm lässt sich aber festlegen, aus welchem Zahlenbereich eine Zufallszahl erzeugt werden darf. Wird nur das Minimum angegeben, erhalten Sie eine Zahl zwischen dem angegebenen Minimum und einer maximalen Zahl, die vom Betriebssystem abhängt. Geben Sie keinen Parameter an, liegt die Zahl zwischen 0 und dem Maximum, abhängig von der Betriebssystemumgebung.

Intern arbeitet rand mit einem Algorithmus, der eine Pseudozufallszahl erzeugt. Das folgende Beispiel soll dies verdeutlichen.

srand(100);  
$zahl1 = rand();  
$zahl2 = rand();  
srand(100);  
$zahl3 = rand();  
$zahl4 = rand();  
echo "Erste Sequenz: $zahl1 / $zahl2<br>\n";  
echo "Zweite Sequenz: $zahl3 / $zahl4<br>\n";

Dieses Beispiel erzeugt Die Ausgabe lautet:

Erste Sequenz: 21197 / 26498
Zweite Sequenz: 21197 / 26498

Wie Sie erkennen können, entspricht der Wert von $zahl1 dem Wert von $zahl3 und derjenige von $zahl2 dem Wert von $zahl4. Bei Verwendung des gleichen Initialisierungswerts für srand erhalten Sie also immer die gleiche Zufallszahlensequenz.

Anders ist dies bei Verwendung des aktuellen Zeitpunkts als Initialisierungswert:

srand((double) microtime()*time());

Die Funktion microtime gibt die Mikrosekunden zum UNIX-Zeitstempel als String zurück, weshalb auch die explizite Umwandlung mittels double erfolgt. Anschließend wird die Zahl mit dem Rückgabewert von time multipliziert, was zu einem garantiert unterschiedlichen Initialisierungswert selbst in kurzen Scripts führt.

srand((double)microtime()*time());  
$zahl1 = rand();  
$zahl2 = rand();  
srand((double)microtime()*time());  
$zahl3 = rand();  
$zahl4 = rand();  
echo "Erste Sequenz: $zahl1 / $zahl2<br>\n";  
echo "Zweite Sequenz: $zahl3 / $zahl4<br>\n";

Die Browserausgabe könnte folgendermaßen aussehen:

Erste Sequenz: 18680 / 20945
Zweite Sequenz: 21268 / 10173

Wie Sie sehen können, sind dies nun vier unterschiedliche Werte.

# Zahlensysteme

Um Zahlen aus dem Dezimal- in das Oktalsystem oder von Hexadezimal nach Binär umzuwandeln, können Sie die Funktion base_convert verwenden.

string base_convert(string number, int frombase, int tobase)

Der Parameter number ist die zu konvertierende Zahl. Der Parameter frombase entspricht dem ursprünglichen System, und tobase entspricht dem System, in das konvertiert werden soll. Die Basis für das Binärsystem lautet 2, für das Oktalsystem 8, für das Dezimalsystem 10 und für das Hexadezimalsystem 16.

echo base_convert("FF",16,10);  
echo base_convert("8",10,2);  
$i = 255;  
echo base_convert((string)$i,10,16);

Die Ausgabe lautet:

255
1000
ff

# Sinus und Kosinus

Zum Errechnen des Sinus oder Kosinus eines Wertes müssen Sie lediglich die Zahl als Parameter übergeben, von der Sie den Sinus oder Kosinus errechnen möchten.

echo sin(90);   // Sinus von 90  
echo cos(0);    // Kosinus von 0

# Zusammenfassung

  • PHP stellt für Zeichenketten die unterschiedlichsten Umwandlungsfunktionen bereit.
  • Ebenso existieren zahlreiche Funktionen zur Manipulation und Operation mit Arrays.

# Fragen und Übungen

  1. Was bewirken die Funktionen strtoupper und strtolower?
  2. Wie können Sie die Länge einer Zeichenkette bzw. eines Strings ermitteln?
  3. Schreiben Sie ein Script, das in einer beliebigen Zeichenkette alle ä, ö, ü, Ä, Ö, Ü, ß und & durch die entsprechenden Entities ersetzt.
  4. Wie können Sie die Größe eines Arrays ermitteln?
  5. Welche beiden Funktionen löschen ein Element eines Arrays und geben dieses zurück?
  6. Welche beiden Funktionen fügen ein Element einem Array hinzu?
  7. Welche Alternative gibt es für die Verwendung der foreach-Schleife?
  8. Schreiben Sie ein Script, das einen Lottozahlengenerator darstellt. Beachten Sie, dass die Zahlen in einem Bereich von 1 bis 49 liegen müssen!