PHP: Den durchschnittlichen Farbwert eines Bildes ermitteln

Mit den folgenden Zeilen Code erhält man die durchschnittliche Farbe eines Bild als RGB-Wert. Das entsprechende Bild wird auf einen Pixel skaliert, der RGB-Farbwert dieses Pixel im Array $color gespeichert.

Recht nützlich, um beispielsweise eine freie Fläche oder einen Hintergrund neben einem Bild automatisch mit einer passenden Farbe zu füllen. Hier gibt es ein Beispiel: http://gfries.de/324.php

<?php
  $file = 'deinbild.jpg';
  $image = imagecreatefromjpeg($file);
  $w = imagesx($image);
  $h = imagesy($image);
  $avarage_pixel = imagecreatetruecolor(1, 1);
  imagecopyresampled($avarage_pixel, $image, 0, 0, 0, 0, 1, 1, $w, $h);
  $rgb = imagecolorat($avarage_pixel, 0, 0);
  $color = imagecolorsforindex($avarage_pixel, $rgb);
  $r = $color['red'];
  $g = $color['green'];
  $b = $color['blue'];
?>
Als Textdatei öffnen | since1985de_5794e45b.txt | 455 Byte

13. Februar 2010

  • Eingeordnet unter: PHP
  • keine Antworten

PHP: SimpleXML-Tipp um Ausgabefehler frühzeitig zu vermeiden

Vor kurzem hat sich Script von mir zerschossen, weil beim umwandeln einer XML-Datei in ein Objekt via simplexml_load_file() ein Fehler durch das BOM in der XML-Datei ausgelöst wurde.

Als Byte Order Mark (BOM, dt. „Bytereihenfolge-Markierung“) wird das Unicode-Zeichen U+FEFF (zero-width non-breaking space) am Anfang eines Datenstroms bezeichnet, wo es als Signatur zur Definition der Byte-Reihenfolge und Kodierungsform in UCS/Unicode-Zeichenketten verwendet wird. http://de.wikipedia.org/wiki/Byte_Order_Mark

Mein Script war zu diesem Zeitpunkt noch sehr fehleranfällig: Ich habe lediglich geprüft, ob die benötigte XML-Datei auf dem Server vorhanden ist und sie im Erfolgsfall mittels simplexml_load_file() als Objekt zurück geben lassen.

<?php
	$file = 'xml/data.xml';
	if(file_exists($file)){
		$xml = simplexml_load_file($file);
		$txt = $xml->screen->txt;
	}
	echo $txt;
?>
Als Textdatei öffnen | since1985de_ef558f9b.txt | 185 Byte

Eine andere Lösung musste her.

Aber durch den vom BOM ausgelösten Fehler – der sich zwar durch manuelles entfernen beheben lassen würde – merkte ich, dass man, gerade wenn man keine Kontrolle über die XML-Dateien hat da sie von mehreren Anwendern bearbeitet werden, einen kleinen Umweg gehen muss. Der Inhalt der XML-Datei wird mittels file_get_contents() ausgelesen und per simplexml_load_string() als Objekt zurück geliefert. Außerdem wird das BOM durch die Funktion trim() entfernt und bei Bedarf ein Fehler ausgegeben.

<?php
	$file = 'xml/data.xml';
	if(file_exists($file)){
		$string = trim(file_get_contents($file));
		$xml = simplexml_load_string($string);
		$txt = $xml->screen->txt;
	} else {
		$txt = 'Fehler: Ich konnte '.$file.' nicht finden.';
	}
	echo $txt;
?>
Als Textdatei öffnen | since1985de_8e8ccd83.txt | 298 Byte

Wenn man schon dabei ist …

Nachdem ich nun schon recht zufrieden mit dieser weniger fehleranfälligen Version meines Scripts war, habe ich mir noch gedacht, dass es vielleicht sinnvoll wäre neben der Existenz der XML-Datei auch noch zu prüfen, ob es sich bei dem zurück gelieferten Wert um en Objekt handelt.

<?php
	$file = 'xml/data.xml';
	if(file_exists($file)){
		$string = trim(file_get_contents($file));
		$xml = simplexml_load_string($string);
		if(is_object($xml)){
			$txt = $xml->screen->txt;
		} else {
			$txt = 'Fehler: Damit kann ich nicht arbeiten.';
		}
	} else {
		$txt = 'Fehler: Ich konnte '.$file.' nicht finden.';
	}
	echo $txt;
?>
Als Textdatei öffnen | since1985de_c7ec04e2.txt | 389 Byte

6. Februar 2010

  • Eingeordnet unter: PHP
  • keine Antworten

PHP: Prüfen ob Wert gerade oder ungerade ist.

Mit dieser Funktion kann man prüfen, ob eine Zahl gerade oder ungerade ist. Nützlich um beispielsweise einzelne Listenpunkte abwechselnd einzufärben.

<?php
function is_odd($number) {
	$number % 2 == 0 ? $out = false : $out = true;
	return $out;
}
 
/* Beispiel */
for($i = 0; $i <=10; $i++){
	is_odd($i) ? $class = "ungerade" : $class = "gerade";
	$out = '
<li class="'.$class.'">'.$i.' ist '.$class.'</li>
 
';
	echo $out;
}
?>
Als Textdatei öffnen | since1985de_dbc64b2a.txt | 325 Byte

23. Dezember 2009

  • Eingeordnet unter: PHP
  • 4 Antworten

PHP: Ordner, Dateien oder bestimmten Dateityp eines Verzeichnis auslesen mit nur einer Zeile Code

Achtung, in diesem Beispiel wird die PHP5-Funktion scandir() verwendet!

Dieses Thema kommt immer wieder auf: Man möchte alle Ordner, Dateien, oder bestimmte Dateitypen eines Verzeichnis auslesen. Dank der PHP5-Funktion scandir() und der schon länger geliebten Funktion preg_match() geht das mittlerweile quasi in einer Zeile. Zwar ist mein Ansatz nicht ganz unanfällig für Fehler, da theoretisch auch Ordner Punkte im Dateinamen enthalten können, aber mit diesem Wissen im Hintergrund und der Vermeidung eben solcher Schreibweisen verfügt man über eine – in meinen Augen – recht performante Lösung.

<?php
function getSubfolder($path){
	foreach(scandir($path) as $item)
	!preg_match("/\./", $item) ? $out .= $item.'<br/>' : NULL;
	return $out;
}
echo getSubfolder($_SERVER['DOCUMENT_ROOT']);
 
function getFile($path){
	foreach(scandir($path) as $item)
	preg_match("/\./", $item) && $item != '.' && $item != '..' ? $out .= $item.'<br/>' : NULL;
	return $out;
}
echo getFile($_SERVER['DOCUMENT_ROOT']);
 
function getFileByType($path, $type = 'jpg'){
	foreach(scandir($path) as $item)
	preg_match("/\.$type/", $item) && $item != '.' && $item != '..' ? $out .= $item.'<br/>' : NULL;
	return $out;
}
echo getFileByType($_SERVER['DOCUMENT_ROOT']);
?>
Als Textdatei öffnen | since1985de_76228e48.txt | 693 Byte

Ein Beispiel aus der Praxis

In einem Framework von mit verwende ich eine Variation, um Dateien per include_once() einzubinden.

<?php
function dirEachFileIncludeOnce($path){
    foreach(scandir($path) as $item) !preg_match("/\./", $item) ? include_once($path.$item.'/'.$item.'.php') : NULL;
}
?>
Als Textdatei öffnen | since1985de_12d9d71f.txt | 214 Byte

22. Dezember 2009

  • Eingeordnet unter: PHP
  • keine Antworten

Twitter: Search-API mit PHP und json_decode ansprechen

Um diese Funktion zu nutzen, sollte man sich zunächst die notwendigen Informationen bezüglich Limitierungen und anderen Sachinhalten im API-Wiki von twitter.com durchgelesen haben.

Die Funktion gibt das Suchergebnis über die Variable $query als JSON-Objekt zurück. Mittels der PHP-internen Funktion json_decode() wird das JSON-Objekt in ein gebräuchliches Array umgewandelt und in der Variable $output gespeichert. Über print_r($output) kann man nun den Inhalt des Array ausgeben um alle Werte einzusehen. Mit echo $output->results[$i]->feld_name; werden die einzelnen Felder des Array ausgegeben.

Der Code

<?php
function search_twitter_json($query, $pages) {
 
/*	Beispielausgabe für Array $output
 
    [text] => Das Wetter ist mal wieder super hier in #Duisburg
    [to_user_id] =>
    [from_user] => gfriesde
    [id] => 4357215930
    [from_user_id] => 14796934
    [iso_language_code] => de
    [source] => &lt;a href=&quot;http://example.net/&quot;&gt;ExampleTool&lt;/a&gt;
    [profile_image_url] => http://example.net/pfad/zum/bild.jpg
    [created_at] => Sat, 06 Jun 2009 20:30:29 +0000
 
    // pro $pages werden 15 ergebnisse geliefert.
*/
 
	for ( $z=0; $z<$pages; ++$z ) {
		if ( $z == 0) { $url = "http://search.twitter.com/search.json?q=$query"; }
		else { $url    = "http://search.twitter.com/search.json?q=$query&page=$z"; }
    	$search = file_get_contents( $url );
    	if ( $search === false ) { die( 'Error.' );}
 
    	$output = json_decode($search);
    	$out_len = sizeof($output->results);
 
    	for ( $i=0; $i<$out_len; ++$i ) {
    		$tweet[$i] = $output->results[$i]->text;
    		$pic[$i] = $output->results[$i]->profile_image_url;
    		$date[$i] = $output->results[$i]->created_at;
    		$user[$i] = $output->results[$i]->from_user;
    		$user_id[$i] = $output->results[$i]->from_user_id;
 
    		echo $tweet[$i]."<br/>";
    	       }
	}
}
 
search_twitter_json("%23duisburg", 1);
 
?>
Als Textdatei öffnen | since1985de_151949a9.txt | 1.33 Kilobyte

6. Dezember 2009

PHP: Übermäßig lange Wörter im Text-String trennen

Sicherlich kennt ihr die Probleme die sich ergeben wenn man dem Benutzer erlaubt Text auf der Webseite zu hinterlassen. Sei es ein Kommentar, ein Beitrag im Forum oder ... was auch immer! Solche Texte können - auch wenn sie kein Spam sind - unerwünschte Ergebnisse liefern. Beispielsweise gibt es Benutzer, die zum Spaß alle Worte eines Satzes zusammen schreiben und so das komplette Layout zerstören.

Eine kleine PHP-Funktion bietet hier Abhilfe. Wörter ab einer bestimmten Länge werden einfach durch ein Leerzeichen getrennt und somit zu zwei "Wörtern".

Der Code

<?php
function shortenWords($text, $laenge) {
	$woerter = explode(" ", $text);
	// alle Wörter prüfen
	for($i = 0; $i <= count($woerter); $i++)
	{
		// Wort zu lang?
		if(strlen($woerter[$i]) >= $laenge)
		{
			// Wort teilen
			$woerter[$i] = chunk_split($woerter[$i], $laenge, " ");
		}
	$text = implode(" ", $woerter);
	}
return $text;
}
shortenWords($nachricht, 255);
?>
Als Textdatei öffnen | since1985de_f092de43.txt | 423 Byte

6. Dezember 2009

  • Eingeordnet unter: PHP
  • eine Antwort

PHP: Aktuelles Datum mit deutschen (oder eigenen) Monatsnamen ausgeben

Wer sich in PHP über die interne date()-Funktion das aktuelle Datum ausgibt und kennt sicherlich das Problem, dass Monatsnamen leider nur auf Englisch verfügbar sind. Mit dieser kleinen Funktion bekommt ihr ein schickes "deutsches" Datum.

Die Monatsbezeichnungen werden in ein Array geschrieben - der für den aktuellen Monat relevante Wert wird ausgelesen. natürlich kann man diese Funktion auch für andere Sprachen anpassen.

Der Code

<?php
function currentGermanDate() {
	$timestamp = time();
	$monate = array( 1=>"Januar",2=>"Februar",3=>"M&auml;rz",
	4=>"April",5=>"Mai",6=>"Juni",7=>"Juli",8=>"August",
	9=>"September",10=>"Oktober",11=>"November",12=>"Dezember");
 
	$monat = date("n");
	echo date("d") .". ". $monate[$monat] ." ". date("Y");
}
 
currentGermanDate();
 
?>
Als Textdatei öffnen | since1985de_a3392352.txt | 388 Byte

6. Dezember 2009

  • Eingeordnet unter: PHP
  • keine Antworten

PHP: Abfragen ob Datei auf einem externen Server vorhanden ist

In Zeiten offener APIs werden oftmals Daten von fremden Servern abgefragt. Soweit recht nützlich. Ein Problem gibt es nur, wenn diese Server nicht erreichbar sind.

Diese Script prüft ob die Datei $file geöffnet werden kann und unterbindet im gegenteiligen Fall die PHP-interne Fehlerausgabe (welche in diesem Fall nur eine Warnung ist) durch das @ vor der Funktion fopen. Über eine if-else Anweisung können eigene Regeln für die wechselseitige Ausgabe deklariert werden.

<?php
	$file = "http://ws.audioscrobbler.com/1.0/user/boringplanet/recenttracks.txt";
	if(@fopen($file, "r")) {
		echo "Datei existiert";
	}
	else {
		echo "Datei nicht gefunden!";
	}
?>
Als Textdatei öffnen | since1985de_b3477bc8.txt | 232 Byte

6. Dezember 2009

  • Eingeordnet unter: PHP
  • keine Antworten

Twitter: Reguläre Ausdrücke in PHP für die volle Integration von Tweets

Da ich nun schon von mehreren Leuten nach den Regulären Ausdrücken (RegEx auf de.wikipedia.org) zum ersetzen von #hashtag und @username in Twitter-Statusnachrichten gefragt wurde, veröffentliche ich sie hier. Zusätzlich gibt es noch die Regulären Ausdrücke um normale Hyperlinks klickbar zu machen.

Wer mehr zum Thema wissen will

Bei Fragen oder Problemen könnt ihr gerne einen Kommentar schreiben - weitere Erklärungen zu den Regulären Ausdrücken erspar ich mir an dieser Stelle und verweise auf die Webseite devmag.net auf der es eine ausführliche Dokumentation zum Thema RegEx gibt.

Der Code

<?php
// Hyperlinks klickbar machen
$pattern = "/(^|\s)(([a-zA-Z]+:\/\/)([a-z][a-z0-9_\..-]*[a-z]{2,6})([a-zA-Z0-9\/*-?&%]*))/i";
$replace = "$1<a href=\"$2\" class=\"twitter-link\" rel=\"external\">$2</a>";
$str = preg_replace($pattern, $replace, $str);
$pattern = "/(^|\s)(www\.([a-z][a-z0-9_\..-]*[a-z]{2,6})([a-zA-Z0-9\/*-?&%]*))/i";
$replace = "$1<a href=\"http://$2\" class=\"twitter-link\" rel=\"external\">$2</a>";
$str = preg_replace($pattern, $replace, $str);
 
// #hashtags klickbar machen und auf Twitter-Suche verweisen
$pattern = "/(^|\s)&#35;(\w*)/i";
$replace = "$1<a href=\"http://twitter.com/search?q=$2\" class=\"twitter-hashtag\" rel=\"external\">#$2</a>";
$str = preg_replace($pattern, $replace, $str);
 
// @username klickbar machen und auf Twitter-Profil verweisen
$pattern = "/(^|\s)@(\w*)/i";
$replace = "$1<a href=\"http://twitter.com/$2\" class=\"twitter-user\" rel=\"external\">@$2</a>";
$str = preg_replace($pattern, $replace, $str);
?>
Als Textdatei öffnen | since1985de_87f5f37a.txt | 1011 Byte

6. Dezember 2009

PHP: Einfacher Weg um Text-Strings zu kürzen ohne Wörter zu beschneiden

Natürlich gibt es viele Wege um an ein bestimmtest Ziel zu kommen. So auch, wenn man einen Text-String in PHP ab einer bestimmten Anzahl von Zeichen kürzen will ohne dabei die Wörter abzuschneiden. Ich habe einige schreckliche Beispiele gesehen – lange Funktionen die es unnötig kompliziert machen. Dabei kann es doch so einfach sein!

Wenn es mal etwas kürzer sein soll

Ich habe vor einiger Zeit ein Snippet entdeckt, dass quasi mit einer Zeile Code auskommt. Der Text $text wird nach $laenge abgeschnitten, ohne dabei die Wörter zu beschneiden. Außerdem kann eine Startposition $start festgelegt werden.

Zu beachten sei hierbei jedoch, dass die Verwendung dieses Codes nur bei reinem Text – ohne HTML-Tags oder ähnlichem – Sinn macht, da Tags nicht geschlossen werden und somit fehlerhafter HTML-Code produziert werden könnte.

Der Code

<?php
	$start = 0;
	$laenge = 120;
	$text =  preg_replace("/[^ ]*$/", '', substr($text, $start, $laenge));
?>
Als Textdatei öffnen | since1985de_6f55dd49.txt | 155 Byte

6. Dezember 2009

  • Eingeordnet unter: PHP
  • keine Antworten