Jan
27
geschrieben von rok am 27. Januar 2010
Diese Herausforderung hatte ich jüngst zu meistern. Ursprung war eine recht unsinnige Datenbankstruktur bei einem Kunden. Dort gibt es keine Normalisierung im Datenbankuniversum :-(
Aber nun genug gejammert. Auch damit muss man als Programmierer klar kommen. Die Problemstellung ist, dass eine Hierarchie durch eine Zeichenfolge in einem Textfeld angegeben wird. Dabei können mehrere Hierarchien auftreten, die ebenfalls durch ein Zeichen getrennt werden. Das sieht dann so aus:
2|15;2|8Das Trennzeichen verschiedener Hierarchiedefinitionen ist das ";" (Semikolon). Die Hierarchieebenen werden mit dem "|" (Pipe) getrennt. Obige Darstellung signalisiert also ein Element, welches sich einmal in Hierarchie "2" -> "15" und einmal in Hierarchie "2" -> "8" befindet. Die Hierarchieebene "2" ist also eine Oberebene und besitzt mindestens zwei Unterebenen. Nun wird diese Hierchie für eine Verlinkung genutzt. Da ist es natürlich sehr passend, wenn man den Link abhängig von den Hierarchieebenen zusammenbaut. Befinde ich mich gerade in der Ebene "15", dann will ich auch den Link via "2" -> "15" erhalten und in Ebene "8" eben umgekehrt. Nach kurzem Suchen fand ich dann die Lösung:
function array_find($haystack, $needle)
{
$iterator = create_function('$item', 'return strpos($item, \''.$needle.'\')!==false;');
return array_filter($haystack, $iterator);
}
function array_contains($haystack, $needle)
{
$iterator = create_function('$value, $item', 'return $value or strpos($item, \''.$needle.'\')!==false;');
return array_reduce($haystack, $iterator, false);
}
Diese beiden Funktionen liefern einmal ein Array mit den gefundenen Elementen. Die andere ein Boolean, ob das gesuchte Element sich irgendwo in den Werten befindet.
Hier ein Beispiel der Anwendung:
$needle = 'foo';
$array = array('affe', 'barfoos', 'cherry', 'dilemma', 'eisberg', 'fastfood');
printf('Das Array enthält irgendwo den String "%s": [%s]'.PHP_EOL, $needle, array_contains($array, $needle) ? 'X' : '-');
printf('Die folgenden Elemente enthalten den String "%s": [%s]'.PHP_EOL, $needle, implode(',', array_find($array, $needle)));
Die Ausgabe sieht dann so aus:
Das Array enthält irgendwo den String "foo": [X]
Die folgenden Elemente enthalten den String "foo": [barfoos,fastfood]
Mit diesen Funktionen konnte ich nun sehr elegant - ohne Schleife - die Herausforderung bewältigen. Danke Google, Klamm und tleilax. Tags: php
Ich hab heute mal eine “hübsche” Backup & Restore Lösung gesucht, mit der ich automatisiert DB-Backups machen kann und in einer Weboberfläche die einzelnen Backups auch wiederherstellen kann.
Tags: database
Nachdem ich immer wieder mit der Suchindizierung Apache Lucene in Kontakt komme wollte ich nun auch mal diese Suche in meinem Blog zur Anwendung bringen. Aber selber machen dauert etwas…und wir haben doch keine Zeit
Tags: database, lucene, search-engine, search-index, wordpress
