Kategorie-Archiv: PHP

PHP Tipps und Tricks

PHP Mehrdimensionale Arrays

Mehrdimensionale Arrays zu sortieren bereitet gerade Einsteiger immer wieder Schwierigkeiten.
Zuallererst bauen wir uns ein Array auf:

$array   = array();
$array[] = array('vorname'=> 'Hans', 
                 'name'   => 'Meier', 
                 'plz'    => '10119', 
                 'ort'    => 'Berlin');
 
$array[] = array('vorname'=> 'Egon', 
                 'name'   => 'Schmidt', 
                 'plz'    => '01067', 
                 'ort'    => 'Dresden');
 
$array[] = array('vorname'=> 'Franz', 
                 'name'   => 'Müller',
                 'plz'    => '50670', 
                 'ort'    => 'Köln');

Zur Vorbereitung auf die Sortierung, erstellen wir im nächsten Schritt ein Hilfsarray.

foreach ($array as $key => $value)
{
    $hilfsarray_vorname[$key]  =  $value['vorname'];
    $hilfsarray_name[$key]     =  $value['name'];
    $hilfsarray_plz[$key]      =  $value['plz'];
    $hilfsarray_ort[$key]      =  $value['ort'];
}

Einfache Sortierung

Die Variable $array wird direkt sortiert.

// sortieren nach Vorname
array_multisort($hilfsarray_vorname, SORT_ASC, SORT_NATURAL, $array);
 
// sortieren nach Name
array_multisort($hilfsarray_name, SORT_ASC, SORT_NATURAL, $array);
 
// sortieren nach Plz
array_multisort($hilfsarray_plz, SORT_ASC, SORT_NUMERIC, $array);
 
// sortieren nach Ort
array_multisort($hilfsarray_ort, SORT_ASC, SORT_NATURAL, $array);

Mehrfache Sortierung

// sortieren nach Vorname aufsteigend und Name absteigend
array_multisort($hilfsarray_vorname, SORT_ASC, SORT_NATURAL, $hilfsarray_name, SORT_DESC, SORT_NATURAL, $array);
 
// sortieren nach Plz absteigend und Ort aufsteigend
array_multisort($hilfsarray_plz, SORT_DESC, SORT_NUMERIC, $hilfsarray_ort, SORT_ASC, SORT_NATURAL, $array);

Hinweis

PHP unterstützt erst ab Version 5.4 das FLAG “SORT_NATURAL”. Als Workaround bietet es sich an, bei der Erzeugung wie folgt einzugreifen:

foreach ($array as $key => $value)
{
    $hilfsarray_vorname[$key]  =  strtolower($value['vorname']);
    $hilfsarray_name[$key]     =  strtolower($value['name']);
    $hilfsarray_plz[$key]      =  strtolower($value['plz']);
    $hilfsarray_ort[$key]      =  strtolower($value['ort']);
}

Alternativ kann auch die Funktion “array_map” ein komplettes Array in Kleinbuchstaben umwandeln:

$hilfsarray_vorname = array_map('strtolower', $hilfsarray_vorname);

PHP Reguläre Ausdrücke, REGEX oder PREG

Reguläre Ausdrücke sind für viele ein rotes Tuch. In diesem Tipp habe ich daher einige Regex gesammelt. In PHP stehen mehrere Funktionen zur Verfügung, die mit regulären Ausdrücken “gefüttert” werden können. Hier eine kleine Übersicht:

Funktion Beschreibung
preg_filter Sucht und ersetzt mit regulären Ausdrücken
preg_grep Liefert Array-Elemente, die auf ein Suchmuster passen
preg_replace_callback Sucht und ersetzt einen regulären Ausdruck unter Verwendung eines Callbacks
preg_match_all Führt eine umfassende Suche nach Übereinstimmungen mit regulärem Ausdruck durch
preg_match Führt eine Suche mit einem regulären Ausdruck durch
preg_replace Sucht und ersetzt mit regulären Ausdrücken
preg_split Zerlegt eine Zeichenkette anhand eines regulären Ausdrucks
preg_quote Maskiert Zeichen regulärer Ausdrücke

Als nächsten sehen wir einige einfache reguläre Ausdrücke und deren Bedeutung. Die Muster werden immer von einem Begrenzungszeichen (Delimiter) eingeschlossen. Bei der Auswahl des Delimiters ist darauf zu achten, dass dieses Zeichen nicht innerhalb des Musters vorkommt.
Eine kleine Übersicht über Suchmuster:

Regulärer Ausdruck (Pattern) Sucht nach ..
[a-z] einzelner Kleinbuchstabe
[A-Z] einzelner Großbuchstabe
hallo der String “hallo” wird gesucht
[a-z]+ ein oder mehrere Kleinbuchstaben
[g-z] ein einzelner Kleinbuchstabe zwischen “g” und “z”
[abc] die Kleinbuchstaben “a”, “b” und “c”
[a-zA-Z] ein einzelner Buchstabe
[^a-z] Sucht nach einem beliebigen Zeichen, welches kein Kleinbuchstabe ist.
[0-9] eine einzelne Zahl
[0-4a-d]+ jede Zahl zwischen “0” und “4” und jeden Kleinbuchstaben zwischen “a” und “d”
(hallo|welt) die Wörter “hallo” und “welt”
[a-z]{3,5} mindestens drei und maximal fünf Kleinbuchstaben zwischen “a” und “z”

Und jetzt einige Praxisbeispiel:

Den Inhalt der H1 Überschrift einer Webseite ermitteln

$html = "<html><head></head><body><h1>PHP REGEX</h1><h2>Beispiel</h2></body></html>";
preg_match('~<h1>(.+?)</h1>~is', $html, $matches);
 
echo $matches[1];

Den Inhalt aller Überschrift einer Webseite ermitteln

Der Inhalt der Überschriften befindet sich in $matches[2].

$html = "<html><head></head><body><h1>PHP REGEX</h1><h2>Beispiel</h2></body></html>";
preg_match_all('~<h([1-6])>(.+?)</h\1>~is', $html, $matches);
 
var_dump($matches)

Telefonnummer prüfen

Hier wird nur geprüft ob es sich um eine Zahlenfolge handelt. Ein Plus vor der Telefonnummer ist optional.

$nummer = "+4937512345678";
if(preg_match('/^[+]?[0-9]+$/', $nummer)){
	echo "korrekt!";
} else {
	echo "nicht korrekt!";
}

Wiederholende Leerzeichen ersetzen

$text = "PHP REGEX         Test Text.";
$text = preg_replace("/[ ]{2,}/", " ", $text);
 
echo $text;

IP Adresse prüfen

Eine IP Adresse besteht aus vier Blöcken, welche jeweils mit einem Punkt voneinander getrennt sind. Jeder einzelne Block kann im Bereich von 0 – 255 liegen. Mal abgesehen von einigen speziellen Adressen, welche ich nicht berücksichtigt habe, prüft folgendes Regex eine IP Adresse auf Gültigkeit. Spezielle Adresse sind z.B. Broadcast, Zeroconf, Anycast oder Multicast.

$ip = "192.168.12.203";
if(preg_match('/^(([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.){3}([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$/', $ip)){
	echo "korrekt!";
} else {
	echo "nicht korrekt!";
}

Datumsangaben aus ein Text filtern

$text = "Was war noch gleich am 24.12.2010 und was am 1.1.99";  
preg_match_all('/([012]?[0-9]|3[01])\.(0?[0-9]|1[0-2])\.(([12][0-9])?[0-9][0-9])/',$text, $matches);
var_dump($matches[0]);

PHP Switch

Zur Fallunterscheidung in PHP bietet sich die “switch case” Anweisung geradezu an. Zu beachten ist bei PHP, dass die einzelnen Cases, also die Fälle mit einem break abgeschlossen werden müssen. Ist das break nicht vorhanden werden alle weiteren Cases bis zum nächsten break auch mit ausgeführt. Dieses Verhalten kann von Vorteil sein, man muss es nur kennen.
Sollte kein Fall zutreffen wird wenn vorhanden der default-case abgearbeitet.
 

1
2
3
4
5
6
7
8
9
10
11
12
	$i = "A";
	switch ($i){
		case "A":
			echo "Fall A";
			break;
		case "B":
			echo "Fall B";
			break;
		default:
			echo "Standard Fall";
			break;
	}

Wenn der selbe Code für mehrere Fälle gültig ist, muss das break Schlüsselwort fehlen.
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
	$i = "B";
	switch ($i){
		case "A":
		case "B":
		case "C":
			echo "Fall A-C";
			break;
		case "D":
			echo "Fall D";
			break;
		default:
			echo "Standard Fall";
			break;
	}

PHP Array zufällig sortieren

Die Reihenfolge aller Elemente eines Arrays zufällig neu sortieren und anschließend ausgeben. Hier ist die Lösung:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
	//dem Zufall auf die Sprünge helfen
	srand((float)microtime() * 1000000);
 
	//array anlegen
	$karten = array('Bube', 'Dame', 'König');
 
	//zufällig michen
	shuffle($karten);
 
	//array ausgeben
	foreach($karten as $karte){
		echo $karte, '<br />';
	}
?>

PHP Funktion “range”

Alle Zahlen von 0-100 ausgeben ist relativ einfach. Sollen aber z.B. alle Buchstaben von “g” bis “z” angezeigt oder “hochgezählt” werden, ist das schon kniffliger. Eigentlich sind aber beide Problemstellungen gleich und können bequem mit der PHP Funktion “range” gelöst werden. Die Range-Funktion erstellt ein Array mit allen Elementen vom übergebenen Startelement bis zum Endelement. Das erste Beispiel erzeugt ein Array mit allen Buchstaben von “a” bis “z” und gibt die Buchstaben einzeln an den Browser aus.

1
2
3
foreach(range('a','z') as $buchstabe){
	echo $buchstabe;
}

Das zweite Beispiel gibt alle Zahlen von 500 bis 1000 in 100 Schritten aus:

1
2
3
foreach(range(500,1000,100) as $zahl){
	echo $zahl;
}

Oder das Alphabet mal rückwärts ausgeben:

1
2
3
foreach(range('z','a') as $buchstabe){
    echo $buchstabe;
}

Der optionale “step” – Parameter kann auch bei Buchstaben benutzt werden, so ist es auch möglich nur jeder dritten Buchstaben des Alphabets anzuzeigen:

1
2
3
foreach(range('a','z',3) as $buchstabe){
	echo $buchstabe;
}

PHP Cache

Einfach mal einen Cache implementieren, ist die Zielstellung dieses Tipps. Der hier vorgestellte Cache kann einfach in bestehende Projekte integriert werden und legt die fertig geparste Seite im Dateisystem ab. Beim zweiten Aufruf der Seite liefert das Skript den Inhalt des Cachefiles an den Browser zurück.

Quelltext der Datei cache.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
	//cache verzeichnis definieren
	$cachedir = dirname(__FILE__) . '/cachedir/';
 
	//cachefile name definieren
	define('CACHFILE', $cachedir . md5($_SERVER['REQUEST_URI']));
 
	if(is_file(CACHFILE)){
		//cachefile gefunden, an den browser senden und skript beenden
		readfile(CACHFILE);
		exit;
	}
 
	//cachefile nicht gefunden
	ob_start("cache_callback");
 
	function cache_callback($buffer){
		if(!is_file(CACHFILE)){
			//cachfile  im dateisystem ablegen
			file_put_contents(CACHFILE,$buffer);
		}
 
	  //den buffer zur ausgabe an den browser zurückgeben
	  return $buffer;
	}
?>

Für jede zu cachende Seite muss folgendes Skript am Anfang des Quellcodes eingebunden werden:

1
 include 'cache.php';

Damit das Skript funktionieren kann, muss außerdem ein Verzeichnis “cachedir” angelegt werden.

PHP – Median berechnen

Median oder Zentralwert bezeichnet den Mittelwert einer Zahlenreihe. Dabei ist der Median robuster und lässt sich nicht gleich durch einzelne Ausreißer stören.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function median($zahlen_array = array()) {
  $anzahl = count($zahlen_array);
  if($anzahl == 0 ){
    return false;
  }
  sort($zahlen_array);
  if($anzahl % 2 == 0){
    //gerade Anzahl => der Median ist das arithmetische Mittel der beiden mittleren Zahlen
    return ($zahlen_array[ ($anzahl/2) - 1 ] + $zahlen_array[ $anzahl/2 ]) / 2 ;
  } else {    
    //ungerade Anzahl => der mittlere Wert ist der Median    
    return $zahlen_array[$anzahl/2];
  }
} 
echo median( array(90,101,105,110,114,118,120,125,221) );